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.
|
||
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
1SELECT t.email, 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) 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: 5 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0