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

SQL Server中如何让LEAD函数仅对比相同ActivityTypeID的记录

解决LEAD函数跨ActivityTypeID取数的问题

你的问题核心在于当前LEAD函数的分区逻辑只基于StatementCode,导致不同ActivityTypeID的记录被归到同一组,所以LEAD会取出其他类型的记录。要让LEAD仅对比相同ActivityTypeID的记录,只需要在PARTITION BY中同时包含ActivityTypeID即可。

修改后的查询语句

SELECT 
    a.ActivityTypeID,
    acs.ActivityStatementID,
    LEAD(acs.ActivityStatementID) OVER (
        PARTITION BY StatementCode, a.ActivityTypeID  -- 新增ActivityTypeID作为分区条件
        ORDER BY a.ActualDateTime DESC
    ) PreviousStatementID,
    acs.Value as CurrentValue,
    LEAD(acs.Value) OVER (
        PARTITION BY StatementCode, a.ActivityTypeID  -- 同样新增ActivityTypeID
        ORDER BY a.ActualDateTime DESC
    ) as Prev 
FROM ActivityStatement acs 
INNER JOIN Activity a on a.ActivityID = acs.ActivityID 
WHERE 
    a.CustomerID = 128077 
    and a.TenantID = 19 
    and a.ActualDateTime IS NOT NULL

原理说明

PARTITION BY的作用是将整个数据集拆分为多个独立的分组,LEAD函数只会在每个分组内部按照指定的排序规则查找下一条记录。

在你原来的查询中,仅用StatementCode分区,所以即使ActivityTypeID不同,只要StatementCode一致就会被分到同一组。加入a.ActivityTypeID后,只有当StatementCode和ActivityTypeID都相同时,记录才会被归为同一组,这样LEAD就只会在相同类型的记录中获取前一条(按ActualDateTime降序排列的下一条,也就是更早的那条同类型记录)。

验证效果

修改后,你提到的ActivityStatementID=849433(ActivityTypeID=397)和849609(ActivityTypeID=396)会被分到不同的分组,所以LEAD不会再把849609作为849433的PreviousStatementID,而是只会在ActivityTypeID=397的记录中查找符合条件的前一条记录。

内容的提问来源于stack exchange,提问作者Ege Bayrak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:40:57