如何使用DISTINCT查询并保留原始排序返回去重属性列表?
解决SQL去重并保留原始排序的问题
你的测试代码里用DISTINCT能实现去重,但SQL Server不会保证DISTINCT后的结果保留原始插入顺序,得做额外处理才能按属性第一次出现的顺序返回结果。
以下是两种可行的解决方案:
方案一:GROUP BY + 最小ID排序
通过分组获取每个属性第一次出现的最小ID,再按这个ID排序来锁定原始顺序:
DECLARE @Attributes TABLE (ID INT, Attribute VARCHAR(50)) INSERT INTO @Attributes (ID, Attribute) VALUES (1, 'Zebra'),(2, 'Apple'),(3, 'Ball'),(4, 'Zebra'),(5, 'Ball') SELECT Attribute FROM @Attributes GROUP BY Attribute ORDER BY MIN(ID)
方案二:窗口函数标记首次出现
用ROW_NUMBER()窗口函数给每个属性的重复项编号,筛选出首次出现的记录后按ID排序:
DECLARE @Attributes TABLE (ID INT, Attribute VARCHAR(50)) INSERT INTO @Attributes (ID, Attribute) VALUES (1, 'Zebra'),(2, 'Apple'),(3, 'Ball'),(4, 'Zebra'),(5, 'Ball') WITH RankedAttributes AS ( SELECT ID, Attribute, ROW_NUMBER() OVER (PARTITION BY Attribute ORDER BY ID) AS rn FROM @Attributes ) SELECT Attribute FROM RankedAttributes WHERE rn = 1 ORDER BY ID
两种方法都能得到你期望的结果:
Zebra
Apple
Ball
内容的提问来源于stack exchange,提问作者Tommy Sharp
相关产品推荐
相关产品推荐

