Předpokládejme, že vaše tabulka je Event
a sloupce jsou EventID
a Name
. Pořadí (tj. 1, 2, 3 atd.), ve kterém se každý člověk účastnil událostí, můžeme určit pomocí následujícího dotazu:
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
Můžeme využít PersonalEventSequence
seskupit události každé osoby do pruhů:
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
Nyní, když jsou události každé osoby seskupeny do pruhů (s nepochybně podivnými čísly StreakGroup!), můžeme určit délky pruhů každé 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
Nyní, když známe délky čar jednotlivých osob, můžeme určit délku nejdelších čar každé 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
Poznámky:
- OP chtěl pouze aktuální pruhy (tj. pruhy, které zahrnují nejnovější událost), ale konkrétní řešení nechávám na OP, aby zjistil, protože zde uvedené obecné řešení bude použitelné pro více programátorů. li>
- Kód lze vyčistit pomocí zobrazení namísto dílčích dotazů.
- Tento kód jsem nezkoušel spustit. Mohou tam být chyby.