按ID分组实现含DATE1空值/重复值的Enddate字段计算逻辑问询
按ID分组实现含DATE1空值/重复值的Enddate字段计算逻辑问询
各位好~我现在碰到一个按ID分组计算Enddate字段的需求,试着用分析函数LAG()处理,但在DATE1重复、DATE1为空值的场景下卡壳了,想请教下大家怎么解决这个问题。
需求逻辑说明
首先明确核心规则:按ID分组后以DATE2降序排序,再计算Enddate:
- 每组中DATE2最大的行(排序后的首行),Enddate固定为
31/12/2150 - 其余行的Enddate规则:
- 若多行的DATE1相同(包括DATE1为null的行),这些行要共用同一个Enddate值
- 这个共用值取下一个不同的有效DATE1日期减1天;空DATE1的行归到最近的非空DATE1组,和该组用同一个Enddate
举个实际例子:ID=6的组里,DATE2最大的行是21/12/2012 7/02/2013,所以Enddate是31/12/2150;下一组DATE1为13/04/2006的行,Enddate就是20/12/2012(即上一组DATE121/12/2012减1天);而DATE1为22/12/2000的多行和DATE1为空的两行,Enddate都是12/04/2012(下一组DATE113/04/2006减1天)。
示例数据
| ID | DATE1 | DATE2 | Enddate |
|---|---|---|---|
| 6 | 11/01/2000 | 5/01/2001 | 12/03/2000 |
| 6 | 11/01/2000 | 10/01/2001 | 12/03/2000 |
| 6 | 11/01/2000 | 15/01/2001 | 12/03/2000 |
| 6 | null | 1/01/2001 | 21/12/2000 |
| 6 | 13/03/2000 | 8/01/2001 | 21/12/2000 |
| 6 | 13/03/2000 | 1/02/2001 | 21/12/2000 |
| 6 | null | 5/02/2001 | 12/04/2012 |
| 6 | null | 5/03/2001 | 12/04/2012 |
| 6 | 22/12/2000 | 5/04/2001 | 12/04/2012 |
| 6 | 22/12/2000 | 18/03/2004 | 12/04/2012 |
| 6 | 13/04/2006 | 13/04/2006 | 20/12/2012 |
| 6 | 21/12/2012 | 7/02/2013 | 31/12/2150 |
| 1 | 17/07/2014 | 17/07/2014 | 23/10/2014 |
| 1 | 17/07/2014 | 15/09/2016 | 23/10/2014 |
| 1 | 24/10/2017 | 2/11/2017 | 31/12/2150 |
| 1 | 24/10/2017 | 18/07/2019 | 31/12/2150 |
| 1 | 24/10/2017 | 30/04/2020 | 31/12/2150 |
| 1 | 24/10/2017 | 3/06/2021 | 31/12/2150 |
| 9 | null | 28/03/2024 | 31/12/2150 |
遇到的问题
我之前尝试用LAG()函数获取上一行的DATE1并减1天,但有两个核心问题解决不了:
- 无法处理DATE1重复的多行:这些行需要共用同一个Enddate,而不是每行单独取LAG的结果
- 无法正确归类DATE1为空的行:不知道怎么把空值行关联到最近的非空DATE1组,统一使用对应的Enddate
想请教大家,有没有合适的分析函数组合(比如结合DENSE_RANK()、FIRST_VALUE()或者自定义窗口分组)来实现这个逻辑?如果是SQL语句的话,该怎么写比较合适呢?
内容来源于stack exchange
相关产品推荐
相关产品推荐

