像这样的问题可能已经被问到并得到了回答,但我很难找到任何东西(很难知道到底该搜索什么/如何表达)。
如果我有一个按日期列出的数值表:
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“,但我不确定如何将当前表行的date
与当前窗口行的”日期“区分开来:
select *,
max(date) filter (where date < input.date + interval '5 days') over w
from input
window w as (order by date desc)
我认为我可以使用子查询实现第二种方法,但我很好奇:是否可以使用窗口函数来实现这一点?谢谢!
编辑:第二种方法是错误的。它可以为应该在同一组中的不同日期找到不同的“按日期分组”。
发布于 2018-05-13 18:31:51
编辑:实际上,这是错误的!这可以找到一个不同的“按”日期的日期,不同的日期应该在同一组中。
下面是我如何通过一个子查询实现这一点:
select date, name, (
select max(date)
from input as i2
where date < input.date + interval '5 days'
) as date_group
from input
插入这个外部查询可以获得我想要的结果:
select min_date, max_date, names
from (
select date_group, min(date) as min_date, max(date) as max_date, string_agg(name, ', ') as names
from groups -- results of above query, e.g. using CTE
group by date_group
order by date_group desc
) as x
仍然好奇的是,是否有一种方法可以通过窗口函数来实现这一点。谢谢!
https://stackoverflow.com/questions/50319285
复制相似问题