Nehmen wir an, Ihre Tabelle ist Event
und die Spalten sind EventID
und Name
. Wir können die Reihenfolge (d. h. 1, 2, 3 usw.) ermitteln, in der jede Person an Veranstaltungen teilgenommen hat, indem wir die folgende Abfrage ausführen:
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
Wir können PersonalEventSequence
nutzen um die Ereignisse jeder Person in Streaks zu gruppieren:
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
Nun, da die Ereignisse jeder Person in Streaks gruppiert sind (mit zugegebenermaßen seltsamen StreakGroup-Nummern!), können wir die Länge der Streaks jeder Person bestimmen:
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
Da wir nun die Länge der Strähnen jeder Person kennen, können wir die Länge der längsten Strähnen jeder Person bestimmen:
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
Hinweise:
- Das OP wollte nur aktuelle Streaks (d. h. Streaks, die das neueste Ereignis enthalten), aber ich überlasse es dem OP, diese spezifische Lösung herauszufinden, da die hier gezeigte allgemeine Lösung auf mehr Programmierer anwendbar sein wird. li>
- Der Code könnte bereinigt werden, indem Ansichten anstelle von Unterabfragen verwendet werden.
- Ich habe nicht versucht, diesen Code auszuführen. Es könnten Fehler auftreten.