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

求助:SQL查询需保留重复记录且不使用DISTINCT的解决方案

保留所有记录的前提下处理SQL重复姓名与身份证号问题

问题场景

当前使用的SQL查询:

select UserTableID as [ID], Ad_Soyad AS [NAME SURNAME], Kimlik_No AS [IDENTIFICATION NUMBER]
from SA_OtelRezervasyon

返回结果中,存在NAME SURNAME和IDENTIFICATION NUMBER完全相同但ID不同的重复记录:

ID   NAME SURNAME        IDENTIFICATION NUMBER 
1    Ali AKYÜZ           11111111111
2    Osman               22222222222
3    Ali AKYÜZ           11111111111
4    Mustafa Batuhan     33333333333

由于中间件依赖ID(UserTableID)填充数据,无法使用DISTINCT(会过滤掉部分ID记录),需要保留所有记录的同时处理重复问题。


解决方案

1. 标记重复项(保留所有记录)

用ROW_NUMBER()窗口函数按姓名和身份证号分组,给每组内的记录编号,轻松区分重复条目:

select 
    UserTableID as [ID], 
    Ad_Soyad AS [NAME SURNAME], 
    Kimlik_No AS [IDENTIFICATION NUMBER],
    ROW_NUMBER() OVER(PARTITION BY Ad_Soyad, Kimlik_No ORDER BY UserTableID) as [Duplicate_Index]
from SA_OtelRezervasyon

返回结果示例:

ID   NAME SURNAME        IDENTIFICATION NUMBER  Duplicate_Index
1    Ali AKYÜZ           11111111111           1
3    Ali AKYÜZ           11111111111           2
2    Osman               22222222222           1
4    Mustafa Batuhan     33333333333           1

Duplicate_Index为1的是每组第一条记录,大于1的就是重复项。

2. 避免重复显示姓名/身份证号(仍保留所有ID)

如果需要前端不重复展示姓名和身份证号,但中间件必须拿到所有ID,用CASE结合窗口函数实现:

select 
    UserTableID as [ID], 
    CASE WHEN ROW_NUMBER() OVER(PARTITION BY Ad_Soyad, Kimlik_No ORDER BY UserTableID) = 1 
         THEN Ad_Soyad 
         ELSE NULL 
    END AS [NAME SURNAME],
    CASE WHEN ROW_NUMBER() OVER(PARTITION BY Ad_Soyad, Kimlik_No ORDER BY UserTableID) = 1 
         THEN Kimlik_No 
         ELSE NULL 
    END AS [IDENTIFICATION NUMBER]
from SA_OtelRezervasyon
order by UserTableID

返回结果示例:

ID   NAME SURNAME        IDENTIFICATION NUMBER 
1    Ali AKYÜZ           11111111111
2    Osman               22222222222
3    NULL                NULL
4    Mustafa Batuhan     33333333333

3. 关联主记录ID(追踪重复来源)

如果需要知道每条重复记录对应的同组主记录(比如最小ID的条目),用自关联查询:

select 
    t1.UserTableID as [ID], 
    t1.Ad_Soyad AS [NAME SURNAME], 
    t1.Kimlik_No AS [IDENTIFICATION NUMBER],
    t2.Min_ID as [Master_Record_ID]
from SA_OtelRezervasyon t1
inner join (
    select Ad_Soyad, Kimlik_No, MIN(UserTableID) as Min_ID
    from SA_OtelRezervasyon
    group by Ad_Soyad, Kimlik_No
) t2 on t1.Ad_Soyad = t2.Ad_Soyad and t1.Kimlik_No = t2.Kimlik_No

返回结果示例:

ID   NAME SURNAME        IDENTIFICATION NUMBER  Master_Record_ID
1    Ali AKYÜZ           11111111111           1
3    Ali AKYÜZ           11111111111           1
2    Osman               22222222222           2
4    Mustafa Batuhan     33333333333           4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:25:18