SQL - 组的子组中的期间范围

Posted

技术标签:

【中文标题】SQL - 组的子组中的期间范围【英文标题】:SQL - Period range in subgroups of a group by 【发布时间】:2021-12-03 11:37:51 【问题描述】:

我有以下数据集:

A B C
1 John 2018-08-14
1 John 2018-08-20
1 John 2018-09-03
2 John 2018-11-13
2 John 2018-12-11
2 John 2018-12-12
1 John 2020-01-20
1 John 2020-01-21
3 John 2021-03-02
3 John 2021-03-03
1 John 2020-05-10
1 John 2020-05-12

我希望得到以下结果:

A B C
1 John 2018-08-14
2 John 2018-11-13
1 John 2020-01-20
3 John 2021-03-02
1 John 2020-05-10

如果我按 A 分组,B 第一行和第三行只是连接,这是连贯的。我如何创建另一个列以仍然使用 group by 并获得我想要的结果。 如果您有其他想法而不是我的想法,请解释一下! 我尝试使用一些 first、last、rank、dense_rank,但没有成功。

【问题讨论】:

同一年返回两次 (1, John) 的组合的规则是什么? 数据集的顺序很重要。这就是我们不能按 A 和 B 分组的原因。这就是我被卡住的原因:/ 【参考方案1】:

使用滞后()。看起来 B 是您数据中 A 的函数。所以检查 lag(A) 就足够了。

select A,B,C
from (
    select *, case when lag(A) over(order by C) = A then 0 else 1 end startFlag
    from mytable 
) t
where startFlag = 1
order by C

【讨论】:

以上是关于SQL - 组的子组中的期间范围的主要内容,如果未能解决你的问题,请参考以下文章

获取组的所有子组[重复]

访问报告中的子组总和

将现有的 GitLab 项目移动到新的子组中

Ruby on Rails 中的表关联

读取/过滤分发组的活动目录的子组?

正则表达式 c# 获取捕获组的子组