这样的问题可能已经被问过&回答,但我找不到任何东西(很难知道究竟要搜索什么/怎么说这个)。
如果我按日期有一个值表:
select *
from (values
(date '2018-05-11', 'lorem'),
(date '2018-05-10', 'ipsum'),
(date '2018-05-07', 'dolor'),
(date '2018-05-05', 'hello'),
(date '2018-05-04', 'world'),
(date '2018-04-30', 'foo'),
(date '2018-04-15', 'bar')
) as v(date, name)
order by date desc
如何按日期组聚合值(例如“5天”) - 按第一个值动态分组(例如5月11日至7日,6月1日,4月30日26日等),不是静态的(例如模5天)?
期望的结果:
min_date | max_date | names
-----------+------------+--------------------
2018-05-07 | 2018-05-11 | lorem, ipsum, dolor
2018-05-04 | 2018-05-05 | hello, world
2018-04-30 | 2018-04-30 | foo
2018-04-15 | 2018-04-15 | bar
----
我认为我需要首先导出最大日期以对每一行进行分组,例如, 2018-05-11
,2018-05-05
等
我尝试了两种概念方法,但都没有工作。
---
第一种方法是建立这个滚动最大日期,但这是无效的(column "groupbydate" does not exist
):
select *,
case
when date > (lag(groupByDate) over w) - interval '5 days' then (lag(groupByDate) over w)
else date
end as groupByDate
from input
window w as (order by date desc)
----
第二种方法是“找到”每行的max /“group by”,但我不确定如何将当前 table 行的date
与当前行区分开来 window 行的日期:
select *,
max(date) filter (where date < input.date + interval '5 days') over w
from input
window w as (order by date desc)
我想我可以使用子查询实现第二种方法,但我很好奇:是否可以使用窗口函数实现这一点?谢谢!
编辑:第二种方法是错误的。对于应该在同一组中的不同日期,它可以找到不同的“分组依据”日期。