用于选择重复交易的SQL

时间:2016-11-15 04:03:24

标签: sql sql-server sql-server-2008 tsql

我在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
  1. 没有ID为3和6的订单,因为它们是唯一的。
  2. 所有字段都应在输出中
  3. 这相当于识别重复记录,但在输出中我想要重复记录和原始记录。

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

    感谢您的帮助

2 个答案:

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