首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据优先级列对列表进行重复数据删除的提示

根据优先级列对列表进行重复数据删除的提示
EN

Stack Overflow用户
提问于 2009-07-31 02:43:06
回答 2查看 1.7K关注 0票数 2

我有一组包含重复条目的行,因为这些数据来自多个源。我还有一个单独的参考表,用于指示这些数据源的优先级。

有没有人有关于最有效的t-SQL去重这个列表的好建议?

基本上我有:

代码语言:javascript
复制
SELECT a.*, b.priority 
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId

我一直把它放到一个临时表中,然后以一种奇怪的方式删除它,我想这种方式可能会更有效率。

代码语言:javascript
复制
DELETE ta
FROM #tmp ta
JOIN #tmp tb
ON ta.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority

表A具有两个来源的相同列,但数据可能不同-因此它们可能具有不同的价格。挑战在于,我必须从具有最高优先级的来源的行中获取价格(以及所有其他信息)。更复杂的是,我没有来自所有来源的每个项目的数据。

因此,项1可能具有来自源A和B的数据,而项2可能仅具有来自源B和C的数据。因此,需要在每个唯一项的基础上进行删除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-31 03:06:07

我认为你可以这样做:

代码语言:javascript
复制
SELECT a.*, b.priority 
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId and b.priority = (select max(priority) from tableB where b.sourceId = a.sourceId)

我不记得tSql是否在子查询的作用域内。

票数 1
EN

Stack Overflow用户

发布于 2009-07-31 03:13:36

试着用ROW_NUMBER找到你想要保留的,然后去掉剩下的。

...and记住以分号结束上一条语句...

代码语言:javascript
复制
with t as (
SELECT a.*, row_number() over (partition by a.sourceid order by b.priority desc) as priorityorder
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
)
--select * from t
delete t 
where priorityorder > 1;

抢夺

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1210430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档