Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> pobranie po jednym rekordzie z grupy
nospor
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
KILIUSZKIN
post
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 (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif)

Ten post edytował KILIUSZKIN 8.12.2006, 10:42:42
Go to the top of the page
+Quote Post
nospor
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
KILIUSZKIN
post
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
Go to the top of the page
+Quote Post
nospor
post
Post #5





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




Dzięki wielkie, działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

ps: musze sie przestawic z myslenia MySql na myslenie Oracle
Go to the top of the page
+Quote Post
prond
post
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;
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 14:19