查找重复记录的高效查询

时间:2010-12-10 08:14:09

标签: sql sql-server sql-server-2005 tsql

我需要在表格中查询重复的存款记录,其中在一个现金终端上以相同的金额在特定时间窗口内进行的两次存款被视为重复记录。我现在开始处理一个查询,但我很感激任何有关“正确”执行此操作的建议或建议。

2 个答案:

答案 0 :(得分:2)

简单聚合

SELECT
   col1, col2, col3, ...
FROM
   MyTable
GROUP BY
   col1, col2, col3, ...
HAVING
   COUNT(*) >= 2

不要包含您的身份/密钥/ PK列:这将是每行唯一的并且使汇总混乱。

要删除或保留一行,请在该

上执行MAX或MIN
SELECT
   col1, col2, col3, ...,
   MAX(IDCol) AS RowToDelete,
   MIN(IDCol) AS RowToKeep
FROM
   MyTable
GROUP BY
   col1, col2, col3, ...
HAVING
   COUNT(*) >= 2

当然,有3个重复,然后做“保持”。

编辑:

对于时间窗口内的行,请使用自联接或窗口/排名功能

答案 1 :(得分:2)

通常情况下,您要对同一个表进行自我加入,并将您的“重复”条件放在加入条件中。

E.g。

SELECT
    *
FROM
    Transactions t1
        inner join
    Transactions t2
        on
            t1.Terminal = t2.Terminal and
            t1.Amount = t2.Amount and
            DATEDIFF(minute,t2.TransactionDate,t1.TransactionDate) between 0 and 10 and
            t1.TransactionID > t2.TransactionID /* prevent matching the same row */