Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobranie po jednym rekordzie z grupy
Forum PHP.pl > Forum > Bazy danych > Oracle
nospor
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)
KILIUSZKIN
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
nospor
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
KILIUSZKIN
  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. -----------
nospor
Dzięki wielkie, działa smile.gif

ps: musze sie przestawic z myslenia MySql na myslenie Oracle
prond
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;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.