SQL Postgres双重分组

use*_*686 2 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

如我所知,我必须使用group by两次-首先要获得月份和位置的最大值,其次要总结第一步中获得的最大值。但是,什么方法可以让我达到最佳性能呢?

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

Joh*_*ger 6

我看不到使用子查询的替代方法。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
Run Code Online (Sandbox Code Playgroud)