我在sql server db中的表结构如下
id field1 field2 field3 field4 field5 field6 field7
1 x 10 abc x x x x
2 x 10 abc x1 x6 x2 x2
3 x 10 xyz x2 x6 x3 x3
4 x 20 abc x3 x7 x4 x4
5 x 20 abc x4 x8 x5 x5
6 x 10 abc x5 x9 x6 x6
根据我的商业逻辑,id 1,2,4,5作为重复订单,因为它们在field1,field2和field3中具有相同的值。我写什么HIGH PERFORMANCE查询只检索那些重复出现的订单。即,我想要输出如下
id field1 field2 field3 field4 field5 field6 field7
1 x 10 abc x x x x
2 x 10 abc x1 x6 x2 x2
4 x 20 abc x3 x7 x4 x4
5 x 20 abc x4 x8 x5 x5
这相当于识别重复记录,但在输出中我想要重复记录和原始记录。
此外,此表有数百万条记录,因此不要使用临时表和按命令分组。我想我需要使用分区。
感谢您的帮助
答案 0 :(得分:1)
您可以使用COUNT OVER
:
WITH Cte AS(
SELECT *,
cnt = COUNT(*) OVER(PARTITION BY field1, field2, field3)
FROM tbl
)
SELECT
id, field1, field2, field3, field4, field5, field6, field7
FROM Cte
WHERE cnt > 1
答案 1 :(得分:0)
SELECT * FROM #Table T JOIN ( SELECT field1 , field2 , field3
FROM #Table GROUP BY field1 , field2 , field3 HAVING COUNT(*) > 1 ) A ON A.field1 = T.field1 AND A.field2 = T.field2 AND A.field3 = T.field3