2010-12-10 2 views
1

중복 된 입금 레코드에 대해 테이블을 쿼리해야합니다. 동일한 금액의 특정 금액 창에서 한 현금 터미널에서 두 개의 입금이 중복 레코드로 간주됩니다. 이제 쿼리에 대한 작업을 시작했으나이 작업을 '제대로'수행하기위한 조언이나 제안을 주시면 감사하겠습니다.중복 레코드를 찾는 효율적인 쿼리

답변

2

일반적으로, 당신은 자기가 같은 테이블에 조인 수행 넣어 줄 당신의 "중복" 조인 조건의 기준.

예.

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 */ 
2

단순 집계

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

사용자의 신원/키/PK 컬럼을 포함하지 마십시오 :이 행과 총 엉망마다 고유합니다.

그런 다음 "유지"할 3 개 중복으로, 물론 그

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

에 MAX 또는 MIN을 제거하거나 유지해야 할 행을 얻으려면.

편집 :

시간 창 내에서 행의 경우

, 자기를 사용하여 가입 또는 창/순위 기능

+0

정확한 중복을 찾는 것이 좋습니다. –

+0

감사하지만, 두 레코드의 입금 시간 차이를 그룹화하는 것은 어렵습니다. @Damien_The_Unbeliever는보다 유연한 쿼리를 제공합니다. – ProfK

관련 문제