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