我有一组包含重复条目的行,因为这些数据来自多个源。我还有一个单独的参考表,用于指示这些数据源的优先级。
有没有人有关于最有效的t-SQL去重这个列表的好建议?
基本上我有:
SELECT a.*, b.priority
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId我一直把它放到一个临时表中,然后以一种奇怪的方式删除它,我想这种方式可能会更有效率。
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的数据。因此,需要在每个唯一项的基础上进行删除。
发布于 2009-07-31 03:06:07
我认为你可以这样做:
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是否在子查询的作用域内。
发布于 2009-07-31 03:13:36
试着用ROW_NUMBER找到你想要保留的,然后去掉剩下的。
...and记住以分号结束上一条语句...
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;抢夺
https://stackoverflow.com/questions/1210430
复制相似问题