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

SQL多值字段拆分后去重与精准匹配技术问询

解决SQL拆分多值字段后重复行的问题

看起来你已经用DelimitedSplit8K函数完成了多值字段的拆分,但因为每个字段拆出了多个条目,导致每个ID生成了重复行。要实现每个ID/账号对应唯一Plan并正确匹配Tax字段,我们可以通过关联ID的序号和拆分项的位置来筛选出需要的行。

解决方案代码

WITH SplitData AS (
    SELECT 
        [ID], 
        [account_number], 
        [Plan], 
        DepositList.Item AS Deposits,
        Tax1List.Item AS Tax1,
        Tax2List.Item AS Tax2,
        DepositList.ItemNumber,
        -- 给同一账号下的ID按顺序编号,用来匹配拆分项的位置
        ROW_NUMBER() OVER(PARTITION BY account_number ORDER BY ID) AS IDSeq
    FROM MVTable
    CROSS APPLY dbo.DelimitedSplit8K(MVTable.Deposits, ';') AS Depositlist
    CROSS APPLY dbo.DelimitedSplit8K(MVTable.Tax1, ';') AS Tax1List
    CROSS APPLY dbo.DelimitedSplit8K(MVTable.Tax2, ';') AS Tax2List
    WHERE DepositList.Itemnumber = Tax1list.itemnumber 
      AND Depositlist.itemnumber = Tax2list.itemnumber
)
SELECT ID, account_number, Plan, Deposits, Tax1, Tax2
FROM SplitData
WHERE ItemNumber = IDSeq;

代码说明

  1. CTE拆分数据:先用CROSS APPLY拆分所有多值字段,同时保留拆分项的ItemNumber(即拆分后条目的位置,从1开始计数)。
  2. 生成ID序号:用ROW_NUMBER()窗口函数给同一账号下的ID按顺序编号(IDSeq),这样第一个ID对应序号1,第二个对应序号2,以此类推。
  3. 筛选匹配行:通过ItemNumber = IDSeq的条件,让每个ID对应到拆分后的对应位置条目,从而得到每个ID唯一的一行数据,正好匹配你想要的结果。

为什么原查询会生成重复行?

原查询中,每个多值字段拆出2个条目,CROSS APPLY会将这些条目按ItemNumber匹配,所以每个ID会生成2行数据(对应拆分后的2个条目)。我们通过添加序号关联的条件,精准筛选出每个ID需要的那一行,就解决了重复问题。

内容的提问来源于stack exchange,提问作者prathap kasthuri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:58:06