如何修改含临时表的SQL查询以消除studentvisit临时表重复记录?
解决studentvisit临时表重复记录的方案
你的问题出在DISTINCT是基于所有选中字段的组合去重,如果这些字段中存在任何细微差异(比如studentvisitstarttime的毫秒数不同、某个字段有不同值),都会被判定为不同记录而保留。要精准去重,建议用窗口函数替代DISTINCT,根据业务逻辑确定唯一标识规则。
修改后的完整查询代码
with clientbridge as ( Select * from ( Select visitorid, --Visid roomnumber, room_id, profid, student_id, cohd.datekey, -- 修正原代码字段引用错误,表别名是cohd而非ambc RANK() over(PARTITION BY visitorid,student_id,profid ORDER BY cohd.datekey desc) as rn from university.course_office_hour_bridge cohd --where student_id = '9999999-aaaa-6634-bbbb-96fa18a9046e' ) t where rn = 1 ), studentvisit as ( SELECT * FROM ( SELECT visid_visitorid, uniquevisitkey, studentaccountid_5, profid_officenumber_8, studentvisitstarttime, room_id_115, qqq144, --Course Name qqq145, -- Course Office Hour Benefit qqq146, --Course Office Hour ID datekey, -- 核心:按业务唯一键分区,这里假设uniquevisitkey是单条访问的唯一标识 -- 如果uniquevisitkey不唯一,可替换为组合字段,比如visid_visitorid + qqq146 + datekey -- 按访问时间降序,保留最新的一条记录 ROW_NUMBER() OVER(PARTITION BY uniquevisitkey ORDER BY studentvisitstarttime DESC) AS rn FROM university.office_hour_details ohd WHERE DateKey >= '2022-10-01' AND (qqq146 <> '') ) t WHERE rn = 1 -- 只保留每组的第一条,实现精准去重 ) select * from clientbridge ab inner join studentvisit sv on sv.visid_visitorid = ab.visitorid -- 修正原代码别名错误,cb改为ab
关键修改说明
替换DISTINCT为窗口函数:
- 用
ROW_NUMBER()按你认定的唯一标识字段/字段组合分区(比如uniquevisitkey,或visid_visitorid+qqq146+datekey),确保每组只保留一条记录。 - 可以通过
ORDER BY指定保留哪一条(比如最新的studentvisitstarttime),比DISTINCT更灵活可控。
- 用
修正两处语法错误:
- 原查询中
clientbridge子查询里的ambc.datekey属于字段引用错误,表别名实际是cohd,已修正。 - 最后关联查询时,
clientbridge的别名是ab,但写了cb.visitorid,已修正为ab.visitorid。
- 原查询中
内容的提问来源于stack exchange,提问作者Data Manliness
相关产品推荐
相关产品推荐

