2013-11-09 55 views
1

我想知道如何通過固定數量的記錄對窗口進行分區。按固定記錄數分區

示例(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語句。它必須是一個單一的查詢,因爲外部解析器將執行它(我無法控制)。看起來很簡單,我在最近幾天突然想起了它:)

回答

0

您可以使用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; 

您可以使用內嵌視圖代替,以構建。

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; 

Results

| 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 | 
+0

你認爲有可能實現相同的結果,而不使用 '與' 建設?我將編輯我的帖子,使其更加清晰,我需要一個「單一聲明」解決方案。 –

+0

@JaneDoe,更新了答案。 – Noel

+1

解析器確實接受內聯視圖。我從你的詢問中學到了很多:)謝謝。 –