2016-11-15 51 views
0

我的表结构如下SQL选择重复发生的交易在SQL Server数据库

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 

按我的商务逻辑,IDS 1,2,4,5作为经常性的订单,因为他们在字段1相同的价值观, 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 
  1. 没有订单号3和6,因为它们是独一无二的。
  2. 各个领域的,应在输出

这相当于识别重复的记录,但在输出我想重复和原始记录。

此外,此表有数百万条记录,因此不想使用临时表和按命令分组。我想我需要使用分区。

感谢您的帮助

回答

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 
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