Autor | Zpráva | ||
---|---|---|---|
pajadvorak Profil |
#1 · Zasláno: 4. 4. 2020, 21:23:57
Potřeboval bych, prosím, pomoct s příkazem pro MySQL. Chci vyhledat duplicity emailů. V tabulce je datum vložení. A já chci hledat duplicitu vložení s rozdílem data vložení například 1 měsíc. Takže všechny ostatní duplicity, které jsou od sebe více jak 1 měsíc potřebuji ignorovat. Jak to mám udělat? Děkuji moc za pomoc.
SELECT `email`, COUNT(email) AS pocet_vyskytu FROM tabulka GROUP BY email HAVING pocet_vyskytu > 1 |
||
Kajman Profil |
#2 · Zasláno: 4. 4. 2020, 22:04:24
Jaká verze mysql?
|
||
pajadvorak Profil |
#3 · Zasláno: 5. 4. 2020, 07:05:48
Kajman:
10.1.41-MariaDB-0+deb9u1 - Debian 9.9 |
||
Kajman Profil |
Asi něco jako
SELECT t.email, t.vlozeno FROM tabulka t JOIN tabulka t2 ON t.email = t2.email AND t2.vlozeno BETWEEN Date_sub(t.vlozeno, INTERVAL 1 month) AND Date_add(t.vlozeno, INTERVAL 1 month) GROUP BY t.email, t.vlozeno HAVING Count(*) >= 2 Od verze 10.2.2 by to šlo ladně řešit window funkcemi lag a lead. |
||
pajadvorak Profil |
#5 · Zasláno: 5. 4. 2020, 21:34:02
Kajman:
To bohužel nefunguje dobře. Ukáže to mnoho výsledků. A když dám zobrazit t.vlozeno a t2.vlozeno, tak je tam shodný datum. Data by se měla předpokládám lišit. A t.email, ani t2.email nic neukáže. Mělo by to de facto ukázat pář řádků. Celý proces trvá cca 17 vteřin, v tabulce je cca 120.000 řádků. Půjde to vyřešit lépe? Děkuji moc za pomoc. |
||
juriad_ Profil * |
#6 · Zasláno: 5. 4. 2020, 22:45:49
Ono to najde duplicitu z obou stran. Chtělo by to rozbít symetrii časové podmínky. Vhodné by bylo také zakázat shodný čas vlozeno.
Zkus tedy: t2.vlozeno > t.vlozena and t2.vlozeno < date_add(t.vlozeno, interval 1 month) Zkus si také vypsat max(t2.vlozeno) .
Ono to vrací víc řádků nejspíš ptoto, že v rámci jednoho měsíce je duplicit jednoho e-mailu víc. Úplně to lehce vyřešit nepůjde, protože si představ 3 záznamy se stejným e-mailem 20 dnů po sobě. První a třetí nejsou vzájemně duplicitní. Nebo chceš raději identifikovat duplicitní záznamy a pak nad nimi vypočítat tranzitivní uzávěr a vrátit jediného reprezentanta? |
||
Kajman Profil |
#7 · Zasláno: 6. 4. 2020, 01:41:47
pajadvorak:
Bez struktury tabulky se nedá uhádout, zda tam je např. primární klíč. Proto tabulku spojuji i ten samý řádek. Proto je však v having podmínka na počet alespoň 2, kdy se ten jeden sám sebe ignoruje. Pokud tam máte mnoho výsledků, tak tipuji, že tam je prostě mnoho duplicit. Vypsalo to nějaký řádek, ke kterému nebyla vypsána i duplicita v hledaném intervalu? Ale možné, že jsem dotaz napsal špatně. Nejlépe, když na sqlfiddle.com nachystáte ukázku dat, kde ten dotaz nevypisuje, co má. Vypisovat sloupce, které nejsou v group by má smysl jen při použití agregační funkce a přísně nastavený server by to ani neměl povolit. Dotaz by se samozřejmě dal napsat mnohem lépe a efektivněji od verze 10.2.2. Ve staré verzi můžete zkusit rychlost poladit dvousloupcovým indexem (email, vlozeno). |
||
Časová prodleva: 11 dní
|
|||
pajadvorak Profil |
#8 · Zasláno: 16. 4. 2020, 15:32:59
Už jsem to nějak dal do kupy. Děkuji.
|
||
Kajman Profil |
#9 · Zasláno: 16. 4. 2020, 16:11:18
A jak to dopadlo?
|
||
Časová prodleva: 4 roky
|
0