Jak wylowic jeden z podwojnych rekordow ?
pluton - 09-06-2006 00:22
Jak wylowic jeden z podwojnych rekordow ?
Witam,
W tabeli jest ID i data. ID jest unikalny, ale na 100000 rekordow trafily sie 3 sztuki, dla ktorych ID sie powtorzyl.
Jak wylowic rekordy z ID unikalnym, a w tych ID, ktore sie powtarzaja wylowic te, ktore maja wieksza date ?
Domyslam sie, ze
select ID,data from tbl trzeba zamienic na select t.id,t.data from tbl t where t.data = ( select max(data) from tbl where ID = t.ID )
ale to bardzo zmniejszy wydajnosc.
Czy jest lepszy sposob ?
pozdrawiam ;pluton
Marcin A. Guzowski - 09-06-2006 00:22
pluton napisał(a): > Witam, > W tabeli jest ID i data. ID jest unikalny, > ale na 100000 rekordow trafily sie 3 sztuki, > dla ktorych ID sie powtorzyl.
To dość nowatorska definicja unikalności :) (taka prawie unikalność albo unikalność o mało co)
> Jak wylowic rekordy z ID unikalnym, a w tych > ID, ktore sie powtarzaja wylowic te, ktore maja wieksza date ? > Domyslam sie, ze > select ID,data from tbl trzeba zamienic na > select t.id,t.data from tbl t > where t.data = ( select max(data) from tbl where ID = t.ID ) > ale to bardzo zmniejszy wydajnosc. > Czy jest lepszy sposob ?
Najprościej będzie:
SELECT ID, max(data) FROM tbl GROUP BY ID
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
Lech Bąk - 09-06-2006 00:22
Użytkownik "Marcin A. Guzowski" <tu_wstaw_moje_imie@guzowski.info> napisał w wiadomości news:e69jil$3sr$1@atlantis.news.tpi.pl... > pluton napisał(a): > > Witam, > > W tabeli jest ID i data. ID jest unikalny, > > ale na 100000 rekordow trafily sie 3 sztuki, > > dla ktorych ID sie powtorzyl. > > To dość nowatorska definicja unikalności :) > (taka prawie unikalność albo unikalność o mało co) > > > Jak wylowic rekordy z ID unikalnym, a w tych > > ID, ktore sie powtarzaja wylowic te, ktore maja wieksza date ? > > Domyslam sie, ze > > select ID,data from tbl trzeba zamienic na > > select t.id,t.data from tbl t > > where t.data = ( select max(data) from tbl where ID = t.ID ) > > ale to bardzo zmniejszy wydajnosc. > > Czy jest lepszy sposob ? > > Najprościej będzie: > > SELECT ID, max(data) FROM tbl > GROUP BY ID > > -- > Pozdrawiam, > Marcin Guzowski > http://guzowski.info
To niestety nie zadziała! Proszę pamiętać, że wszystkie mają ten sam ID a więc dalej nie wiemy, który rekord jest z największą datą (wiemy tylko jaka jest największa data dla każdego ID a to nie to samo). Lepiej już by było dołożyć HAVING sprawdzając COUNT (ID) > 1 ale to też nie rozwiązuje problemu. Dopiero zapytanie podane jako pierwsze rozwiązuje częściowo problem (co jeśli daty są identyczne dla identycznych ID???). Tak naprawdę trzeba się odwołać do wewnętrznych numerów rekordów (większość baz danych ma coś takiego) i w przypadku identycznych ID oraz dat wybierać któryś z rekordów. pozdrawiam Leszek
Bartek Siebab - 09-06-2006 00:22
> pluton w dniu 2006-06-08 17:57 pisze: > Witam, > > W tabeli jest ID i data. ID jest unikalny, > ale na 100000 rekordow trafily sie 3 sztuki, > dla ktorych ID sie powtorzyl.
to trzeba było zawczasu dać unikalny indeks lub klucz główny na to id i nie było by takich jaj :D
-- ..---------- -------- ------ ---- ---- --- - -- - | Bartek `saphire` Siebab http://bartek.siebab.net
Bartek Siebab - 09-06-2006 00:22
> Lech Bąk w dniu 2006-06-08 19:53 pisze:
>>> Jak wylowic rekordy z ID unikalnym, a w tych >>> ID, ktore sie powtarzaja wylowic te, ktore maja wieksza date ?
może najpierw napisz na czym jest ta baza? PostgreSQL/MySQL/Access/DB2/Progress/... ?
-- ..---------- -------- ------ ---- ---- --- - -- - | Bartek `saphire` Siebab http://bartek.siebab.net
Marek Horodyski - 09-06-2006 00:22
Użytkownik "pluton" <zielonadupa@poczta.onet.pl> napisał w wiadomości news:e69hdt$gqn$1@news.onet.pl... > Witam, > > W tabeli jest ID i data. ID jest unikalny, > ale na 100000 rekordow trafily sie 3 sztuki, > dla ktorych ID sie powtorzyl. > > Jak wylowic rekordy z ID unikalnym, a w tych > ID, ktore sie powtarzaja wylowic te, ktore maja wieksza date ? > > Domyslam sie, ze > > select ID,data from tbl trzeba zamienic na > select t.id,t.data from tbl t > where t.data = ( select max(data) from tbl where ID = t.ID ) > > ale to bardzo zmniejszy wydajnosc. > > Czy jest lepszy sposob ? >
wykasowac te 3 niewlasciwe rekordy i zalozyc indeks uniemozliwiajacy powstanie takiej sytuacji ( o ile sie da, bo znam przypadki gdzie tego sie nie da zrobic).
Pozdrawiam, Marek Horodyski
Borafu - 09-06-2006 00:22
Bartek Siebab napisał(a): > > Lech Bąk w dniu 2006-06-08 19:53 pisze: > >>>> Jak wylowic rekordy z ID unikalnym, a w tych >>>> ID, ktore sie powtarzaja wylowic te, ktore maja wieksza date ? > > może najpierw napisz na czym jest ta baza? > PostgreSQL/MySQL/Access/DB2/Progress/... ? > I może jeszcze jedno: chcesz naprawić tę bazę, czy napisać narzędzie, które będzie to robiło samo? Bo jeśli chcesz ją tylko naprawić, to IMHO przy problemie dotyczącym 3 (słownie trzech !) powielonych rekordów to IMHO najszybciej będzie zidentyfikować rekordy i przeprowadzić selekcję "organoleptycznie".
Pozdro -- Borafu
Marcin A. Guzowski - 09-06-2006 00:22
Lech Bąk napisał(a): > To niestety nie zadziała! Proszę pamiętać, że wszystkie mają ten sam ID a > więc dalej nie wiemy, który rekord jest z największą datą (wiemy tylko jaka > jest największa data dla każdego ID a to nie to samo).
Chwila chwila. W przykładzie podanym przez Pytającego w żaden sposób rekord nie był wskazywany: "select t.id,t.data from tbl t (...)" zwraca tylko kombinacje ID-data_maksymalna. Według mnie, acz teraz bawię się we wróżka - nie chodziło o wskazywanie konkretnych wiersz o danym ~rowid (bo i sens tego w zwykłych rozwiązaniach niewielki), tylko uzyskanie z bazy odpowiednich informacji.
> trzeba się odwołać do wewnętrznych numerów rekordów (większość baz danych ma > coś takiego) i w przypadku identycznych ID oraz dat wybierać któryś z > rekordów.
Ale czemu ma to służyć? Po co np. końcowej aplikacji - która pyta o maksymalną datę dla danego ID - dokładne wskazywanie rekordu wewnętrznym numerem?
Jeżeli jednak ktoś się uprze aby to zrobić, to wystarczyłoby zJOINować wynik zapytanie z grupowaniem jeszcze raz z tabelą i wybrać unikalne pole/klucz/ numer wiersza/itp.
[MSSQL:] SELECT T.UNIKALNE_POLE_CZYLI_COS_JAK_ROWID FROM (SELECT ID, max(data) as MaxData FROM tbl GROUP BY ID) Gr INNER JOIN tbl T ON (Gr.ID = T.ID and GR.MaxData = T.data)
Jeżeli kilka rekordów będzie miało kombinację ID-max_data, powyższy join zwróci dwa wiersze dla tego ID. Aby się i przed tym zabezpieczyć i zawsze zwrócić 1 rekord per ID (np. z większym numerem):
[MSSQL:] SELECT T.ID, max(T.UNIKALNE_POLE_CZYLI_COS_JAK_ROWID) FROM (SELECT ID, max(data) as MaxData FROM tbl GROUP BY ID) Gr INNER JOIN tbl T ON (Gr.ID = T.ID and GR.MaxData = T.data) GROUP BY T.ID
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
Migat - 10-06-2006 00:02
Marcin A. Guzowski wrote: > SELECT ID, max(data) FROM tbl > GROUP BY ID
Moze lepiej tak:
SELCT ID,count(ID) from tbl GROUP BY ID;
W wyniku dostaniesz tabele z id i iloscia rekordow dla dango ID. Jesli dodasz HAVING count(ID) > 0 dostaniesz ID gdzie ilosc rekordow dla tego ID jest wieksza od 0.
A swoja droga to na przyszlosc dodaj uniqa to nie bedziesz mial takich problemow.
Pzdr PawelB
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
Jak =?ISO-8859-2?Q?zamieni=E6_dwa_pola_jednej_kolumny_?==?ISO-8859-2?Q?w_dw=F3ch_rekordach_za_pomoc=B1_jednego_zapyt? ==?ISO-8859-2?Q?ania=3F?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
=?ISO-8859-2?Q?WY=B6wietlenie_rekord=F3w_pocz=B1wszy_od_?==?I SO-8859-2?Q?danej_litery=2E=2E=2E?=
=?iso-8859-2?Q?=5BMySQL=5D_Wy=B6wietlenie_wszystkich_rekordow _zawierajacy?==?iso-8859-2?Q?ch_duplikat_a__moze_inna_struktura_bazy_danych ?=
[pgsql] Akcja w =?iso-8859-2?b?emFsZb9ub7ZjaQ==?= od liczby zmienionych =?iso-8859-1?q?rekord=F3w?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[mysql] Wyszukanie =?ISO-8859-2?Q?rekord=F3w=28powiazane_tabel?==?ISO-8859-2?Q?e=29?=
[MySQL]: Dodanie zliczania =?ISO-8859-2?Q?rekord=F3w_do_rozb?==?ISO-8859-2?Q?udowanego_zapytania?=
zanotowane.pldoc.pisz.plpdf.pisz.pladwokat.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|