Laten we aannemen dat uw tafel Event
is en de kolommen zijn EventID
en Name
. We kunnen de volgorde bepalen (d.w.z. 1, 2, 3, enz.) waarin elke persoon evenementen bijwoonde door de volgende vraag:
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
We kunnen gebruik maken van PersonalEventSequence
om de gebeurtenissen van elke persoon in strepen te groeperen:
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 de gebeurtenissen van elke persoon zijn gegroepeerd in strepen (met weliswaar rare StreakGroup-nummers!), kunnen we de lengte van de strepen van elke persoon bepalen:
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 we de lengte van de streaks van elke persoon kennen, kunnen we de lengte van de langste streak van elke persoon bepalen:
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
Opmerkingen:
- De OP wilde alleen huidige strepen (d.w.z. strepen die de laatste gebeurtenis bevatten), maar ik laat die specifieke oplossing over aan de OP om erachter te komen, aangezien de algemene oplossing die hier wordt getoond van toepassing zal zijn op meer programmeurs. li>
- De code kan worden opgeschoond door Views te gebruiken in plaats van subquery's.
- Ik heb niet geprobeerd deze code uit te voeren. Er kunnen fouten zijn.