codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
どうしてもできなかった連勝数・連敗数を取る問題。 再帰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; となるので、 開始日でサマリーをとれば、最大連勝数も、連敗数も、開始日、終了日も取れます。
Private
[
?
]
Run code
Submit