首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过动态组聚合/分区窗口数据?

如何通过动态组聚合/分区窗口数据?
EN

Stack Overflow用户
提问于 2018-05-13 18:24:52
回答 1查看 19关注 0票数 0

像这样的问题可能已经被问到并得到了回答,但我很难找到任何东西(很难知道到底该搜索什么/如何表达)。

如果我有一个按日期列出的数值表:

代码语言:javascript
运行
复制
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天)?

预期结果:

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
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与当前窗口行的”日期“区分开来:

代码语言:javascript
运行
复制
select *,
  max(date) filter (where date < input.date + interval '5 days') over w
from input
window w as (order by date desc)

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-13 18:31:51

编辑:实际上,这是错误的!这可以找到一个不同的“按”日期的日期,不同的日期应该在同一组中。

下面是我如何通过一个子查询实现这一点:

代码语言:javascript
运行
复制
select date, name, (
  select max(date)
  from input as i2
  where date < input.date + interval '5 days'
) as date_group
from input

插入这个外部查询可以获得我想要的结果:

代码语言:javascript
运行
复制
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

仍然好奇的是,是否有一种方法可以通过窗口函数来实现这一点。谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50319285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档