Lad os antage, at din tabel er Event
og kolonnerne er EventID
og Name
. Vi kan bestemme rækkefølgen (dvs. 1, 2, 3 osv.), hvori hver person deltog i begivenheder, ved hjælp af følgende forespørgsel:
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
Vi kan udnytte PersonalEventSequence
for at gruppere hver persons begivenheder i streger:
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
Nu hvor hver persons begivenheder er grupperet i streger (har ganske vist underlige StreakGroup-numre!), kan vi bestemme længden af hver persons streaks:
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
Nu hvor vi kender længden af hver persons streger, kan vi bestemme længden af hver persons længste streak:
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
Bemærkninger:
- OP'en ønskede kun aktuelle streaks (dvs. streaks, der inkluderer den seneste begivenhed), men jeg overlader den specifikke løsning til OP at finde ud af, da den generelle løsning, der er vist her, vil være anvendelig for flere programmører.
- Koden kunne ryddes op ved at bruge Views i stedet for underforespørgsler.
- Jeg har ikke prøvet at køre denne kode. Der kan være fejl.