假设我有一张桌子:
---------------
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日,依此类推。
答案 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';
过滤器位于外部查询中,因此前一个时间段可以及时返回。