按固定记录数进行分区

3
我想知道如何按固定记录数划分窗口。
示例(http://sqlfiddle.com/#!1/7df86)。
CREATE TABLE Games 
(
 id serial primary key, 
 game_no integer not null, 
 points integer,
  constraint game_no unique (game_no)
);

INSERT INTO Games (game_no, points)
VALUES (3123, 5), (3126, 5), (3135, 8), (3128, null), (3130, 1), (3121, 11), 
(3132, 0), (3133, 4), (3110, 7), (3112, null), (3113, 12), (3125, 3),(3134, 8);

我想要三场比赛的分数总和,从最高的比赛编号开始,按比赛编号降序排列。就像这样。
| GAME_NO | POINTS | SUM_THREE |
|---------|--------|-----------|
|    3135 |      8 |        20 |
|    3134 |      8 |        20 |
|    3133 |      4 |        20 |
|    3132 |      0 |         1 |
|    3130 |      1 |         1 |
|    3128 | (null) |         1 |
|    3126 |      5 |        13 |
|    3125 |      3 |        13 |
|    3123 |      5 |        13 |
|    3121 |     11 |        23 |
|    3113 |     12 |        23 |
|    3112 | (null) |        23 |
|    3110 |      7 |         7 |

如何使用窗口函数而不使用子查询来完成这个任务?我也不能使用例如with语句。它必须是一个单一的查询,因为外部解析器将执行它(而我无法控制)。这似乎很简单,但我已经头疼了几天 :)
1个回答

4
您可以使用row_number函数除以3来为每个连续的3行分配唯一编号。然后在每个组上使用sum作为分析函数。 SQL Fiddle
with x(game_no, points, grp) as (
  select game_no, points,
         ceil(cast(row_number() over (order by game_no desc) as decimal)/ 3)
  from games
  )
select game_no, points,
       sum(points) over (partition by grp)
from x
order by game_no desc;

你可以使用内联视图代替with结构。
select game_no, points,
       sum(points) over (partition by grp)
from (
      select game_no, points,
             ceil(cast(row_number() over
                   (order by game_no desc) as decimal)/ 3) as grp
      from games
    ) as x
order by game_no desc;

结果:

| GAME_NO | POINTS | SUM |
|---------|--------|-----|
|    3135 |      8 |  20 |
|    3134 |      8 |  20 |
|    3133 |      4 |  20 |
|    3132 |      0 |   1 |
|    3130 |      1 |   1 |
|    3128 | (null) |   1 |
|    3126 |      5 |  13 |
|    3125 |      3 |  13 |
|    3123 |      5 |  13 |
|    3121 |     11 |  23 |
|    3113 |     12 |  23 |
|    3112 | (null) |  23 |
|    3110 |      7 |   7 |

你认为不使用“with”结构也可以达到相同的结果吗?我会编辑我的帖子,使其更清晰,我需要一个“单个语句”解决方案。 - Jane Doe
@JaneDoe,已更新答案。 - Noel
1
解析器接受内联视图。我从你的查询中学到了很多:) 谢谢。 - Jane Doe
我发现这个查询非常低效 - 是否可以通过索引加速? - malthe
1
我发现内联视图非常有帮助。在我的组织中,我添加了一个属性来按部门执行此计算 :) - marcin2x4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接