Eliminacja zduplikowanych wartości na podstawie tylko jednej kolumny tabeli
Moje zapytanie:
SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
history ON sites.siteName = history.siteName
ORDER BY siteName,date
Pierwsza część wyjścia:
Jak mogę usunąć duplikaty w kolumnie siteName
? Chcę zostawić tylko zaktualizowaną na podstawie date
kolumny.
W powyższym przykładzie potrzebuję wierszy 1, 3, 6, 10
21
2 answers
Tutaj przydaje się funkcja okna row_number()
:
SELECT s.siteName, s.siteIP, h.date
FROM sites s INNER JOIN
(select h.*, row_number() over (partition by siteName order by date desc) as seqnum
from history h
) h
ON s.siteName = h.siteName and seqnum = 1
ORDER BY s.siteName, h.date
21
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-06 23:09:44
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-06 23:09:44
Z twojego przykładu wydaje się rozsądne założenie, że kolumna siteIP
jest określona przez kolumnę siteName
(czyli każda strona ma tylko jedną siteIP
). Jeśli tak jest, to istnieje proste rozwiązanie za pomocą group by
:
select
sites.siteName,
sites.siteIP,
max(history.date)
from sites
inner join history on
sites.siteName=history.siteName
group by
sites.siteName,
sites.siteIP
order by
sites.siteName;
Jeśli jednak moje założenie nie jest poprawne (tzn. możliwe jest, że strona ma wiele siteIP
), to nie jest jasne, z którego siteIP
chcesz, aby zapytanie zwróciło się w drugiej kolumnie. Jeśli tylko siteIP
, to następujące zapytanie będzie do:
select
sites.siteName,
min(sites.siteIP),
max(history.date)
from sites
inner join history on
sites.siteName=history.siteName
group by
sites.siteName
order by
sites.siteName;
8
Author: Mikhail Makarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-07 01:41:32
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-07 01:41:32