微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

间隙和孤岛-如何按ID对每组连续行求和

如何解决间隙和孤岛-如何按ID对每组连续行求和

下面是我当前的sql代码输出。对于CD等于STG(以黄色突出显示)的连续(或单个)行,我只需要获取EFF_DAYS的总和。

    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY TMSP,EFF_DT) RN,Z2.* 
FROM (
    SELECT CASE WHEN (LAG_CD IS NULL OR LAG_CD NOT IN ('STG')) AND CD IN ('STG') 
    THEN RANK() OVER (PARTITION BY ID ORDER BY TMSP,EFF_DT)

    WHEN CD = LAG_CD AND CD IN ('STG') 
    THEN RANK() OVER (PARTITION BY ID ORDER BY TMSP,EFF_DT)

    WHEN CD = LAG_CD AND CD != LEAD_CD 
    THEN RANK() OVER (PARTITION BY ID ORDER BY TMSP,EFF_DT)

    END AS CASES,Z.* FROM (
                SELECT ID,LAG(CD) OVER (PARTITION BY ID ORDER BY TMSP,EFF_DT) AS LAG_CD,LEAD(CD) OVER (PARTITION BY ID ORDER BY TMSP,EFF_DT) AS LEAD_CD,CD,TMSP,EFF_DT,END_EFF_DT,DATEDIFF(day,END_EFF_DT) AS EFF_DAYS
        FROM #POSTCHG_ROWS 
        WHERE ID IN ('ABC123','XYZ789')
        ) Z
    ) Z2 ORDER BY TMSP,EFF_DT

我尝试了各种行号和等级的东西,但是我似乎无法正确地理解CASES列。我花了几个小时来查看其他的gap-island sql解决方案,但是没有遇到下面的确切情况。

Current SQL Query Output for 2 IDs

理想情况下,我的CASES列将如下输出,因此我可以GROUP BY CASES,ID,连续行块的起始TMSP,然后计算:SUM(EFF_DAYS)。

enter image description here

以下是我的目标输出

enter image description here

解决方法

您只对一系列相邻的“ CTG”行感兴趣。我认为最简单的方法是对非“ STG”值进行窗口计数以定义组,然后进行过滤和聚合:

select 
    id,min(tmsp) tmsp,min(eff_dt) eff_dt,sum(datediff(day,eff_dt,end_eff_dt)) sum_eff_days
from (
    select
        p.*
        sum(case when cd = 'STG' then 0 else 1 end) 
            over(partition by id order by tmsp) grp
    from #postchg_rows p
) p
where cd = 'STG'
group by id,grp

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。