[ create a new paste ] login | about

Link: http://codepad.org/LvN01KTv    [ raw code | fork ]

Plain Text, pasted on Jul 2:
どうしてもできなかった連勝数・連敗数を取る問題。

再帰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;

となるので、

開始日でサマリーをとれば、最大連勝数も、連敗数も、開始日、終了日も取れます。



Create a new paste based on this one


Comments: