Sql Postgres双组由

时间:2014-11-07 18:27:30

标签: sql group-by postgresql-9.2

我有三列的表:place_id,date,value。对于每个日期的每个地方都有值,例如

place_id:1,日期:'2014-01-01',值:1
place_id:2,日期:'2014-01-01',价值:2
place_id:1,日期:'2014-02-02',价值:3
place_id:1,日期:'2014-02-03',价值:4
place_id:2,日期:'2014-02-15',价值:5

我的目标是找出每个月所有地方的最大值总和。 在上面的数据的上下文中,它应该看起来(无论日期必须如何显示 - 如两列年和月或一列'yyyy-MM-01'):

日期:'2014-01-01',sum_of_max:3
日期:'2014-02-01',sum_of_max:9

当我得到时,我必须两次使用组 - 首先是为了获得月份和地点的最大值,其次是总结我在第一步获得的最大值。但是,让我以最佳表现做到这一点的方式是什么?

P.S。如果这很重要,我正在使用PostgreSql 9.2

2 个答案:

答案 0 :(得分:5)

我没有看到使用子查询的好选择。 Postgres datetrunc()函数可以帮助您按月对基表中的值进行分组,就像您希望的那样。

SELECT month, SUM(max_value) AS sum_of_max
FROM (
  SELECT place_id, date_trunc('month', date) AS month, MAX(value) AS max_value
  FROM my_table
  GROUP BY place_id, month
  ) mx
GROUP BY month

答案 1 :(得分:1)

一种方法是带有两个group by的子查询:

select mm, sum(maxvalue)
from (select place_id, date_trunc('month', date) as mm, max(value) as maxvalue
      from table t
      group by place_id, date_trunc('month', date)
     ) t
group by mm;

在子查询中使用distinct on可能会提供更好的性能:

select mm, sum(maxvalue)
from (select distinct on (place_id, date) place_id, date_trunc('month', date) as mm,
             max(value) as maxvalue
      from table t
      order by place_id, date_trunc('month', date), value desc
     ) t
group by mm;