znajduje się tabelka z danymi wizyt:SQL problem - obliczyć max dni sekwencja
uid (INT) | created_at (DATETIME)
chcę znaleźć, ile dni z rzędu użytkownik odwiedzał naszą aplikację. Tak na przykład:
SELECT DISTINCT DATE(created_at) AS d FROM visits WHERE uid = 123
powróci:
d
------------
2012-04-28
2012-04-29
2012-04-30
2012-05-03
2012-05-04
Istnieje 5 rekordy i dwa przedziały - 3 dni (28 - 30 APR) i 2 dni (3 - 4 maja).
Moje pytanie brzmi, jak znaleźć maksymalną liczbę dni, które użytkownik odwiedził aplikację z rzędu (3 dni w przykładzie). Próbowałem znaleźć odpowiednią funkcję w dokumentach SQL, ale bez powodzenia. Czy czegoś brakuje?
UPD: Dziękuję chłopaki za odpowiedzi! Właściwie pracuję z bazą danych vertica analytics (http://vertica.com/), jednak jest to bardzo rzadkie rozwiązanie i tylko kilka osób ma z tym doświadczenie. Mimo że obsługuje standard SQL-99.
Cóż, większość rozwiązań działa z niewielkimi modyfikacjami. W końcu stworzył własną wersję zapytania:
-- returns starts of the vitit series
SELECT t1.d as s FROM testing t1
LEFT JOIN testing t2 ON DATE(t2.d) = DATE(TIMESTAMPADD('day', -1, t1.d))
WHERE t2.d is null GROUP BY t1.d
s
---------------------
2012-04-28 01:00:00
2012-05-03 01:00:00
-- returns end of the vitit series
SELECT t1.d as f FROM testing t1
LEFT JOIN testing t2 ON DATE(t2.d) = DATE(TIMESTAMPADD('day', 1, t1.d))
WHERE t2.d is null GROUP BY t1.d
f
---------------------
2012-04-30 01:00:00
2012-05-04 01:00:00
Więc teraz tylko to, co musimy zrobić, to połączyć je w jakiś sposób, na przykład poprzez indeks wiersza.
SELECT s, f, DATEDIFF(day, s, f) + 1 as seq FROM (
SELECT t1.d as s, ROW_NUMBER() OVER() as o1 FROM testing t1
LEFT JOIN testing t2 ON DATE(t2.d) = DATE(TIMESTAMPADD('day', -1, t1.d))
WHERE t2.d is null GROUP BY t1.d
) tbl1 LEFT JOIN (
SELECT t1.d as f, ROW_NUMBER() OVER() as o2 FROM testing t1
LEFT JOIN testing t2 ON DATE(t2.d) = DATE(TIMESTAMPADD('day', 1, t1.d))
WHERE t2.d is null GROUP BY t1.d
) tbl2 ON o1 = o2
Przykładowe wyjście:
s | f | seq
---------------------+---------------------+-----
2012-04-28 01:00:00 | 2012-04-30 01:00:00 | 3
2012-05-03 01:00:00 | 2012-05-04 01:00:00 | 2
Tagged z dwoma różnymi implikacjami sql? Zarówno 'MySQL' jak i' PostGreSQL' mają różne zdolności ... – MatBailie
+1 Dobre podejście. Na 'WHERE t2.d ma wartość NULL GROUP BY t1.d', możesz jednak usunąć' GROUP BY t1.d' jednak :-) Twoje "WHERE t2.d ma wartość null" już zwraca unikalne 't1.d' tak czy inaczej –
Dziękuję za poradę, Michael! – deadrunk