ďťż
 
Jak wylowic jeden z podwojnych rekordow ? ďťż
 
Jak wylowic jeden z podwojnych rekordow ?
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • adwokat.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com