Giả sử bảng của bạn là Event
và các cột là EventID
và Name
. Chúng tôi có thể xác định trình tự (tức là 1, 2, 3, v.v.) trong đó mỗi người đã tham dự các sự kiện bằng truy vấn sau:
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
Chúng ta có thể tận dụng PersonalEventSequence
để nhóm các sự kiện của mỗi người thành các chuỗi:
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
Giờ đây, các sự kiện của mỗi người được nhóm thành các vệt (có số StreakGroup phải thừa nhận là kỳ lạ!), Chúng tôi có thể xác định độ dài của các vệt của mỗi người:
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
Bây giờ chúng ta đã biết độ dài vệt dài của mỗi người, chúng ta có thể xác định độ dài vệt dài nhất của mỗi người:
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
Ghi chú:
- OP chỉ muốn các vệt hiện tại (tức là các vệt bao gồm sự kiện mới nhất), nhưng tôi để giải pháp cụ thể đó cho OP tìm ra vì giải pháp chung hiển thị ở đây sẽ có thể áp dụng cho nhiều lập trình viên hơn.
- Mã có thể được làm sạch bằng cách sử dụng Chế độ xem thay vì truy vấn con.
- Tôi chưa thử chạy mã này. Có thể có lỗi.