テーブルが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
注:
- OPは現在のストリーク(つまり、最新のイベントを含むストリーク)のみを望んでいましたが、ここに示す一般的なソリューションはより多くのプログラマーに適用できるため、その特定のソリューションはOPに任せています。
- サブクエリの代わりにビューを使用してコードをクリーンアップできます。
- このコードを実行しようとしたことはありません。エラーが発生する可能性があります。