如何按动态组聚合/分区窗口数据?

时间:2018-05-13 18:24:53

标签: postgresql

这样的问题可能已经被问过&回答,但我找不到任何东西(很难知道究竟要搜索什么/怎么说这个)。

如果我按日期有一个值表:

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-112018-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)

我想我可以使用子查询实现第二种方法,但我很好奇:是否可以使用窗口函数实现这一点?谢谢!

编辑:第二种方法是错误的。对于应该在同一组中的不同日期,它可以找到不同的“分组依据”日期。

0 个答案:

没有答案