Problem SQL - oblicz sekwencję maksymalnych dni

Istnieje tabela z danymi odwiedzin:

<code>uid (INT) | created_at (DATETIME)
</code>

Chcę sprawdzić, ile dni z rzędu użytkownik odwiedził naszą aplikację. Na przykład:

<code>SELECT DISTINCT DATE(created_at) AS d FROM visits WHERE uid = 123
</code>

wróci:

<code>     d      
------------
 2012-04-28
 2012-04-29
 2012-04-30
 2012-05-03
 2012-05-04
</code>

Dostępnych jest 5 rekordów i dwie interwały - 3 dni (28 - 30 kwietnia) i 2 dni (3 - 4 maja).

Moje pytanie brzmi, jak znaleźć maksymalną liczbę dni, w których użytkownik odwiedził aplikację pod rząd (3 dni w przykładzie). Próbowałem znaleźć odpowiednią funkcję w dokumentach SQL, ale bez powodzenia. Czy czegoś mi brakuje?

UPD: Dziękuję wam 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. Chociaż obsługuje standard SQL-99.

Większość rozwiązań działa z niewielkimi modyfikacjami. W końcu stworzyłem własną wersję zapytania:

<code>-- 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
</code>

Teraz musimy tylko jakoś do nich dołączyć, na przykład według indeksu wierszy.

<code>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 
</code>

Przykładowe wyjście:

<code>          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
</code>

questionAnswers(10)

yourAnswerToTheQuestion