Да приемем, че вашата таблица е Event
и колоните са EventID
и Name
. Можем да определим последователността (т.е. 1, 2, 3 и т.н.), в която всеки човек е присъствал на събития чрез следната заявка:
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
Можем да използваме PersonalEventSequence
за групиране на събитията на всеки човек в ивици:
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
Сега, когато събитията на всеки човек са групирани в ивици (признато, че имат странни номера на StreakGroup!), можем да определим дължините на лентите на всеки човек:
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
Сега, когато знаем дължините на лентите на всеки човек, можем да определим дължината на най-дългата ивица на всеки човек:
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
Бележки:
- ОП искаше само текущи поредици (т.е. ленти, които включват най-новото събитие), но оставям това конкретно решение на ОП да разбере, тъй като общото решение, показано тук, ще бъде приложимо за повече програмисти.
- Кодът може да бъде почистен чрез използване на Views вместо подзаявки.
- Не съм опитвал да стартирам този код. Възможно е да има грешки.