2011-10-12 139 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