2011-10-12 142 views
0
CREATE TABLE games 
    (
     idg serial NOT NULL, 
     nation character(3), 
     points integer, 
     datag date, 
     CONSTRAINT pk_games PRIMARY KEY (idg) 
) 

idg nation points  dateg 
1  ita  12  2011-10-10 
2  fra  9  2011-10-11 
3  ita  4  2011-10-12 
4  fra  8  2011-10-11 
5  ger  12  2011-10-12 
6  aut  6  2011-10-10 
7  ita  11  2011-10-17 
8  ita  10  2011-10-18 
9  fra  9  2011-10-19 
10  ger  15  2011-10-19 
11  fra  16  2011-10-18 

我想顯示按星期分組的最大三個總計。我明白我不能使用MAX(SUM(點),所以我做了一個查詢:返回Postgresql中每組(每週排名前3位)的前三個結果

select extract(week from datag) as "dateg", nation, sum(points) as "total" 
from games 
group by dateg, nation 
order by dateg asc, total desc limit 3 

但這些回報我只是前三合計怎樣才能使之成爲每星期(前三總數?在每個組,這將通過一種 「每週前3」)的任何IDEEA

提前9

由於在PostgreSQL工作

+0

哪個版本您使用的?如果你運行的是8.4+,那麼比使用8.3或更早的版本要容易得多。 –

+0

「PostgreSQL 9.0.4,由Visual C++編譯1500,64位」 – alinux

回答

5

使用window function:?

select idg, nation, points, wk, r 
from (
    select idg, nation, points, extract(week from datag) as wk, 
      row_number() over (partition by extract(week from datag) order by points desc) as r 
    from games 
) as dt 
where r <= 3 

根據需要調整SELECT。如果您想要獨特的排名,您可以在PARTITION中將nation添加到ORDER BY中。

如果你想先對總每星期的點,每個國家,那麼你只需要添加另一個派生表和調整您的列名的一點:

select nation, wk, wk_points, rn 
from (
    select nation, wk, wk_points, 
      row_number() over (partition by wk order by wk_points desc) as rn 
    from (
     select nation, extract(week from datag) wk, sum(points) wk_points 
     from games 
     group by wk, nation 
    ) as dt_sum 
) as dt 
where rn <= 3 
+0

非常感謝你,它的工作,但我必須做的和列「點」的總和按國家分組,他要回我的總數點。我的問題並不清楚,索裏。 – alinux

+0

@alinux:我添加了一個更新,我認爲這就是你要做的。 –

+0

我真的很感謝你。這正是我所期待的。我是Postgresql的新手,我對窗口函數一無所知。再次感謝你。 – alinux