iakioの日記 RSSフィード

2008-12-31

大晦日だけどボウリングのスコア計算するよ

| 19:48 | 大晦日だけどボウリングのスコア計算するよ - iakioの日記 を含むブックマーク はてなブックマーク - 大晦日だけどボウリングのスコア計算するよ - iakioの日記

window functionがcommitされたので何かやってみようと思ったのですが、結局ボウリングしか思いつきませんでした。といってもスコア計算の部分は今までと一緒で、最後の表示部分にrow_number()とsum()を使っているだけですが。

with recursive
s(idx, pins1, pins2, pins3) as (
    select s1.idx, s1.pins, s2.pins, s3.pins
      from score s1
      left join score s2 on (s2.idx = s1.idx + 1)
      left join score s3 on (s3.idx = s1.idx + 2)
),
f(idx, pins1, pins2, pins3) as (
    select idx, pins1, pins2, pins3 from s where idx = 1
     union all
    select s.idx, s.pins1, s.pins2, s.pins3
      from s join f
        on (s.idx = f.idx + case when f.pins1 = 10 then 1 else 2 end)
),
sof(idx, pins1, pins2, pins3, score_of_frame) as (
    select idx
         , pins1, pins2, pins3
         , case when pins1 = 10 then pins1 + pins2 + pins3
                when pins1 + pins2 = 10 then pins1 + pins2 + pins3
                else pins1 + pins2
            end as score_of_frame
           from f
)
select row_number() over w as frame
     , pins1
     , pins2
     , case row_number() over w when 10 then pins3
       else null end as pins3
     , score_of_frame
     , sum(score_of_frame) over w
  from sof
window w as (order by idx)

実行

 frame | pins1 | pins2 | pins3 | score_of_frame | sum
-------+-------+-------+-------+----------------+-----
     1 |     1 |     4 |       |              5 |   5
     2 |     4 |     5 |       |              9 |  14
     3 |     6 |     4 |       |             15 |  29
     4 |     5 |     5 |       |             20 |  49
     5 |    10 |     0 |       |             11 |  60
     6 |     0 |     1 |       |              1 |  61
     7 |     7 |     3 |       |             16 |  77
     8 |     6 |     4 |       |             20 |  97
     9 |    10 |     2 |       |             20 | 117
    10 |     2 |     8 |     6 |             16 | 133
    11 |     6 |       |       |                | 133
(11 rows)

大分見やすくなったのではないでしょうか。

11フレームまで出ているのを気にしてはいけません。

参考:

AketiJyuuzouAketiJyuuzou2009/07/01 22:06http://oraclesqlpuzzle.hp.infoseek.co.jp/blog.html
2009年7月1日(月)のエントリでアレンジしてみました。

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20081231