ID,日期和最近x天的最大值

时间:2019-05-07 13:25:25

标签: sql postgresql max

假设我有一张桌子:

 ---------------
 id |  date | value
------------------
  1 |  Jan 1 | 10
  1 |  Jan 2 | 12
  1 |  Jan 3 | 11
  2 |  Jan 4 | 11

我需要获取过去90天中每个ID,每个日期的最大值和中值。我正在使用查询:

select id, date, value
max(value) over (partition by id, date) as max_date,
median(value) over (partition by id, date) as med_date
from table
where date > date - interval '90 days'

我试图导出数据并手动检查,但结果不正确。我错过了什么吗?谢谢

预期的输出将获得自最近90天以来的最大值。例如日期为4月5日,那么它将找到从1月5日(最后90天)到4月5日的最大值。然后日期移到4月6日,然后它将在1月6日再次执行,直到4月6日,依此类推。

2 个答案:

答案 0 :(得分:0)

所以我假设您可以为相同的ID和Date获得多个值,对吗?否则,对id和date进行分区是没有意义的

SELECT id, date, max(value), avg(value) from table where date > date - interval '90 days'
group by id, value

“分组依据”进行分区

答案 1 :(得分:0)

为什么要使用窗口功能?这似乎符合您的描述:

select id,
       max(value) as max_date,
       percentile_disc(0.5) within group (order by value) as median_value
from table
where date > date - interval '90 days';

如果要每个日期 使用窗口功能:

select t.*
from (select t.*,
             max(value) over (order by date range between '89 day' preceding and current row) as running_max_value,
             percentile_disc(0.5) within group (order by value) range between '89 day' preceding and current row) as running_median_value
      from t
     ) t
where date > date - interval '90 days';

过滤器位于外部查询中,因此前一个时间段可以及时返回。