使用LEAD/LAG函数自连接同表实现指定数据关联的问题
解决方案
根据你的需求,要实现同一用户下相邻Id组(按Seq划分)的分销商关联,避免冗余数据,可按以下两种方式处理:
方式1:保留逐行关联但去重
如果需要每个当前分销商对应下一个Id组的所有分销商,且去除重复的关联行,可使用DISTINCT关键字:
SELECT DISTINCT A.Seq, A.Id, A.Username, A.Distributor, B.Seq AS NextSeq, B.Id AS NextId, B.Distributor AS NextDistributor FROM #Temp A LEFT JOIN #Temp B ON A.Username = B.Username AND A.Seq + 1 = B.Seq WHERE A.Seq = 1 AND A.Username = 'Joe'
方式2:按Id组分组合并分销商
如果希望按Id组(Seq)聚合分销商,得到每组对应下一组的分销商列表,可使用分组聚合+LEAD函数(适用于SQL Server 2017及以上版本):
WITH SeqGroups AS ( SELECT Username, Seq, Id, STRING_AGG(Distributor, ', ') AS Distributors FROM #Temp GROUP BY Username, Seq, Id ) SELECT Username, Seq, Id, Distributors, LEAD(Id) OVER (PARTITION BY Username ORDER BY Seq) AS NextId, LEAD(Distributors) OVER (PARTITION BY Username ORDER BY Seq) AS NextDistributors FROM SeqGroups -- 若需筛选特定用户和Seq,添加WHERE条件 -- WHERE Username = 'Joe' AND Seq = 1
说明
- 你之前使用自连接产生冗余数据,是因为同一Seq下有多条分销商记录,自连接会产生笛卡尔积,这是正常的;若不需要逐行配对,按组聚合是更简洁的方式。
- 若使用LEAD函数,需先按用户和Seq分组,否则会逐行取相邻记录,导致同一Seq内的行重复获取下一行的Id,无法得到正确的下一个Id组信息。
内容的提问来源于stack exchange,提问作者Heinrich
相关产品推荐
相关产品推荐

