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 - 组的子组中的期间范围的主要内容,如果未能解决你的问题,请参考以下文章