Załóżmy, że Twoja tabela to Event
a kolumny to EventID
i Name
. Możemy określić kolejność (tj. 1, 2, 3 itd.), w której każda osoba uczestniczyła w wydarzeniach, za pomocą następującego zapytania:
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
Możemy wykorzystać PersonalEventSequence
aby pogrupować wydarzenia każdej osoby w pasma:
SELECT
Name, EventID - PersonalEventSequence AS StreakGroup
FROM
(
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
) AS SubQuery1
Teraz, gdy zdarzenia każdej osoby są pogrupowane w pasmach (mających co prawda dziwne numery StreakGroup!), możemy określić długość pasm każdej osoby:
SELECT
Name, StreakGroup, COUNT(*) AS StreakLength
FROM
(
SELECT
Name, EventID - PersonalEventSequence AS StreakGroup
FROM
(
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
) AS SubQuery1
) SubQuery2
GROUP BY
Name, StreakGroup
Teraz, gdy znamy długość pasm każdej osoby, możemy określić długość najdłuższej pasji każdej osoby:
SELECT
Name, MAX(StreakLength) AS PersonalRecordStreakLength
FROM
(
SELECT
Name, StreakGroup, COUNT(*) AS StreakLength
FROM
(
SELECT
Name, EventID - PersonalEventSequence AS StreakGroup
FROM
(
SELECT
e1.Name, e1.EventID, COUNT(*) AS PersonalEventSequence
FROM
Event e1
INNER JOIN
Event e2
ON e1.Name = e2.Name AND e1.EventID >= e2.EventID
GROUP BY
e1.Name, e1.EventID
) AS SubQuery1
) SubQuery2
GROUP BY
Name, StreakGroup
) SubQuery3
GROUP BY
Name
Uwagi:
- OP chciał tylko bieżących pasm (tj. pasm, które obejmują najnowsze wydarzenie), ale pozostawiam to konkretne rozwiązanie OP, aby dowiedzieć się, ponieważ ogólne rozwiązanie pokazane tutaj będzie miało zastosowanie do większej liczby programistów.
- Kod można wyczyścić za pomocą widoków zamiast podzapytań.
- Nie próbowałem uruchomić tego kodu. Mogą występować błędy.