Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> pobranie po jednym rekordzie z grupy
nospor
post 7.12.2006, 11:21:05
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Mam strukture:
Cytat
"SEDU_GUID" "GUID" "NAZWA"
"ala" "jakisg1" "Kopia dla guid"
"ola" "jakisg2" "sedu adminJST"
"ala" "jakg3" "sedu2 adminJST"

czyli mam rekordy, ktore na podstawie tej samej SEDU_GUID tworzą grupe rekordów. Tutaj będą to "ala" i "ola". Chcialbym teraz wyciągnąć po jednym rekordzie z kazdej grupy, czyli otrzymac np. tak:
Cytat
"SEDU_GUID" "GUID" "NAZWA"
"ala" "jakisg1" "Kopia dla guid"
"ola" "jakisg2" "sedu adminJST"

NIe interesuje mnie, ktory rekord z grupy zostanie zwrocony. W mysql by to wyglądalo tak:
  1. SELECT sedu_guid, guid, nazwa
  2. FROM sedu GROUP BY sedu_guid;

Ale oczywiscie w tym "genialnym" oraclu juz takie proste rzeczy nie dzialają, bo nie mozna grupowac po jednej kolumnie gdy w select mamy ich wiecej. Zeby dzialalo to musze do group by dowalic wszystkie kolumny co są w select, ale wowczas wywala mi wszystkie rekordy zamiast po jednym z grupy. Da sie to jakos prosto zalatwic?

edit: wymyslilem podzapytanie:
  1. SELECT SEDU.GUID,SEDU.SEDU_GUID,SEDU.NAZWA FROM SEDU WHERE ID IN (SELECT max(ID) FROM sedu GROUP BY (sedu_guid))

Dzialac dziala, ale jak ktos znajdzie rozwiązanie jakies ladniejsze to chętnie poslucham smile.gif

edit:
i mam:
  1. SELECT SEDU.SEDU_GUID,max(SEDU.NAZWA) NAZWA FROM SEDU GROUP BY SEDU_GUID

czyli te kolumny co chce sobie pobrac, to biore w max().... poronione, ale dziala smile.gif

edit:
Dobra, a inaczej:
Chce pobrać rekord, który posiada wartość pola STATUS, będącą wartością najmniejszą w danej grupie (grupowanie po SEDU_GUID). Gdyby takich rekordów bylo kilka, chce pobrac tylko jeden. Ten jeden rekord ma byc tym, ktory byl najwczesniej dodany (pole: DATA_DODANIA).

ps: rzuccie linkiem do jakiegos porządnego manuala/kursu dla oracle, bo juz nerwicy dostaję przy tej bazie. Jakim cudem jest ona uwazana za lepszą od mysql? (pytanie retorycznie - nie odpowiadac)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
KILIUSZKIN
post 8.12.2006, 10:41:03
Post #2





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 26.01.2006

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 7.12.2006, 11:21:05 ) *
Chce pobrać rekord, który posiada wartość pola STATUS, będącą wartością najmniejszą w danej grupie (grupowanie po SEDU_GUID). Gdyby takich rekordów bylo kilka, chce pobrac tylko jeden. Ten jeden rekord ma byc tym, ktory byl najwczesniej dodany (pole: DATA_DODANIA).


Klasyka SQLa:
  1. SELECT sedu_guid, min(STATUS) FROM (SELECT sedu_guid, STATUS, min(data_dodania) FROM sedu GROUP BY sedu_guid,STATUS)
  2. GROUP BY sedu_guid
  3. ORDER BY 1, 2


Siłą ORACLE'a jest PL/SQL a tam można zrobić dosłownie wszystko guitar.gif

Ten post edytował KILIUSZKIN 8.12.2006, 10:42:42


--------------------
________________________________________________________________________________
czy programiści używają jeszcze diagramów ? jeśli nie, to tylko zwykli koderzy są ;)
Go to the top of the page
+Quote Post
nospor
post 8.12.2006, 10:47:33
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




i tak, i nie. Ja prosilem o caly rekord smile.gif
Rekord posiada jeszcze inne kolumny, ktore chcialby pobrac. Jednak dodanie do selecta dodatwkoych kolumn oczywiscie generuje blad, bo przy grupowaniu nie moze byc kolumn w select, jesli nie bylo ich w group by. Jesli zas dolozyc je do group by, to wszystkie wyniki szlag trafia sad.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
KILIUSZKIN
post 8.12.2006, 12:26:41
Post #4





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 26.01.2006

Ostrzeżenie: (0%)
-----


  1. ---------
  2. SELECT s.* FROM sedu s WHERE s.STATUS IN (SELECT min(ss.STATUS) FROM sedu ss WHERE ss.sedu_guid=s.sedu_guid) AND s.data_dodania=
  3. (SELECT min(ss.data_dodania) FROM sedu ss WHERE ss.STATUS=s.STATUS AND ss.sedu_guid=s.sedu_guid)
  4. -----------


Ten post edytował KILIUSZKIN 8.12.2006, 12:28:19


--------------------
________________________________________________________________________________
czy programiści używają jeszcze diagramów ? jeśli nie, to tylko zwykli koderzy są ;)
Go to the top of the page
+Quote Post
nospor
post 8.12.2006, 15:30:21
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Dzięki wielkie, działa smile.gif

ps: musze sie przestawic z myslenia MySql na myslenie Oracle


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
prond
post 19.02.2007, 13:24:14
Post #6





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Pewnie to już za późno, ale w ORACLE na takie potrzeby wymyślono funkcje rankingujące :

  1. SELECT
  2. sedu_guid,
  3. guid,
  4. nazwa,
  5. rank() OVER (PARTITION BY sedu_guid ORDER BY guid ASC) AS r
  6. FROM sedu WHERE r=1;


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 31.07.2025 - 10:46