繁体   English   中英

SQL Postgres双重分组

[英]Sql Postgres double group by

我有三列的表: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

在我得到的时候,我必须两次使用group - 首先是为了获得月份和地点的最大价值,其次是总结我在第一步获得的最大值。 但是,什么方法可以让我达到最佳性能呢?

PS如果有问题,我正在使用PostgreSql 9.2

我看不到使用子查询的替代方法。 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

一种方法是子查询,其中包含两个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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM