簡體   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