You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按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天)。

示例数据

IDDATE1DATE2Enddate
611/01/20005/01/200112/03/2000
611/01/200010/01/200112/03/2000
611/01/200015/01/200112/03/2000
6null1/01/200121/12/2000
613/03/20008/01/200121/12/2000
613/03/20001/02/200121/12/2000
6null5/02/200112/04/2012
6null5/03/200112/04/2012
622/12/20005/04/200112/04/2012
622/12/200018/03/200412/04/2012
613/04/200613/04/200620/12/2012
621/12/20127/02/201331/12/2150
117/07/201417/07/201423/10/2014
117/07/201415/09/201623/10/2014
124/10/20172/11/201731/12/2150
124/10/201718/07/201931/12/2150
124/10/201730/04/202031/12/2150
124/10/20173/06/202131/12/2150
9null28/03/202431/12/2150

遇到的问题

我之前尝试用LAG()函数获取上一行的DATE1并减1天,但有两个核心问题解决不了:

  • 无法处理DATE1重复的多行:这些行需要共用同一个Enddate,而不是每行单独取LAG的结果
  • 无法正确归类DATE1为空的行:不知道怎么把空值行关联到最近的非空DATE1组,统一使用对应的Enddate

想请教大家,有没有合适的分析函数组合(比如结合DENSE_RANK()、FIRST_VALUE()或者自定义窗口分组)来实现这个逻辑?如果是SQL语句的话,该怎么写比较合适呢?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:09:51