どうしてもできなかった連勝数・連敗数を取る問題。
再帰SQLは、他のプログラム言語でやるのを不細工に実現する機能なので、好きじゃない。
だから、何とか再帰SQLを使わない方法を考えたのですが、一晩考えても、
再帰を使わない方法は思いつかなかった。
LAGやFIRST_VALUEなどが使えたら話は別ですけどね……。
再帰SQLのは貼っておくけれど美しくないな……。
WITH
m(ID, 日付, 勝敗値)
AS(
SELECT
ROW_NUMBER()OVER(ORDER BY 日付), 日付, 勝敗値
FROM 試合結果
)
, cte(ID ,開始日付, 日付, 勝敗値, 連勝数, 連敗数)
AS(
SELECT
ID
, 日付 AS 開始日付
, 日付
, 勝敗値
, CASE WHEN 勝敗値 = 1 THEN 1 ELSE 0 END AS 連勝数
, CASE WHEN 勝敗値 = 0 THEN 1 ELSE 0 END AS 連敗数
FROM m
WHERE ID = 1
UNION ALL
SELECT
m.ID
, CASE WHEN cte.勝敗値 = m.勝敗値 THEN cte.開始日付 ELSE m.日付 END AS 開始日付
, m.日付
, m.勝敗値
, CASE WHEN m.勝敗値 = 1 THEN cte.連勝数 + 1 ELSE 0 END AS 連勝数
, CASE WHEN cte.勝敗値 = 0 THEN cte.連敗数 + 1 ELSE 0 END AS 連敗数
FROM m INNER JOIN cte ON m.ID = cte.ID + 1
)
SELECT * FROM cte;
となるので、
開始日でサマリーをとれば、最大連勝数も、連敗数も、開始日、終了日も取れます。