Låt oss anta att din tabell är Event
och kolumnerna är EventID
och Name
. Vi kan bestämma sekvensen (dvs. 1, 2, 3, etc.) i vilken varje person deltog i evenemang genom följande fråga:
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 utnyttja PersonalEventSequence
för att gruppera varje persons händelser i streck:
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 när varje persons händelser är grupperade i streak (med visserligen konstiga StreakGroup-nummer!), kan vi bestämma längden på varje persons streak:
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 när vi vet längden på varje persons streck, kan vi bestämma längden på varje persons längsta rad:
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
Anmärkningar:
- OP ville bara ha aktuella streaks (d.v.s. streaks som inkluderar den senaste händelsen), men jag överlåter den specifika lösningen till OP att ta reda på eftersom den allmänna lösningen som visas här kommer att vara tillämplig på fler programmerare.
- Koden kan rensas genom att använda Views istället för underfrågor.
- Jag har inte provat att köra den här koden. Det kan finnas fel.