【问题标题】:return first three results of every group ( weekly top 3 ) in Postgresql在 Postgresql 中返回每组的前三个结果(每周前 3 个)
【发布时间】:2011-10-12 15:26:41
【问题描述】:
 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(points),所以我进行了下一个查询:

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

但是这些只返回了前三个总数。我怎样才能做到每周(每组的前三个总数,​​这将是一种“每周前三名”)?有什么想法吗?

在 Postgresql 9 中工作。

提前致谢。

【问题讨论】:

  • 您使用的是哪个版本?如果您运行的是 8.4+,则比使用 8.3 或更早版本要容易得多。
  • "PostgreSQL 9.0.4,由 Visual C++ build 1500 编译,64 位"

标签: function postgresql group-by


【解决方案1】:

使用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。如果您想要唯一的排名,可以将nation 添加到 PARTITION 内的 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

【讨论】:

  • 非常感谢,它正在工作,但我必须这样做,并且按国家分组的“积分”列的总和,他应该返回我的总积分。我的问题并不清楚,抱歉。
  • @alinux:我添加了一个更新,我认为这就是你所追求的。
  • 我真的非常感谢你。这正是我一直在寻找的。我是 Postgresql 的新手,我对窗口函数一无所知。再次感谢您。
  • @alinux:PostgreSQL 文档非常好,如果您是 PostgreSQL 新手,值得回顾一下:postgresql.org/docs/9.0/interactive/index.html
  • Windowing 和 CTE 是如此有用的新(真正)功能。
猜你喜欢
  • 2018-05-16
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2019-01-29
相关资源
最近更新 更多