2012-02-03 46 views
5

tôi cần phải loại bỏ bản sao từ một bảng:Loại bỏ trùng lặp bằng phân vùng bởi SQL Server

;WITH cte as(
SELECT ROW_NUMBER() OVER (PARTITION BY [specimen id] 
             ORDER BY (SELECT 0)) RN 
     FROM quicklabdump) 
     delete from cte where RN>1 

Cột quicklabdumpID là khóa chính.

Tôi muốn biết làm thế nào để giữ chỉ lớn nhất quicklabdumpID nơi có nhiều lần xuất hiện của [specimen id]

Trả lời

13

Thay đổi thứ tự của bạn bằng cách để quicklabdumpid DESC.

WITH cte as(
    SELECT ROW_NUMBER() OVER (PARTITION BY [specimen id] 
          ORDER BY quicklabdumpid DESC) RN 
    FROM quicklabdump) 
delete from cte where RN>1 
+0

cảm ơn rất nhiều. bạn có thể vui lòng cho tôi biết là có bất kỳ vấn đề với giải pháp của clint? –

+0

@I__ - Nó sẽ làm tương tự. Có thể có sự khác biệt về hiệu suất. Nếu bạn muốn biết cái nào sẽ nhanh hơn, bạn phải kiểm tra chúng trên dữ liệu của bạn. –

4

Không cần phân vùng

delete q 
    from quicklabdump q 
    where exists 
    (
    select * 
     from quicklabdump q2 
     where q2.[specimen id] = q.[specimen id] and 
     q2.quicklabdumpID > q.quicklabdumpID 
) 
+0

chỉ tò mò, bạn có đang xóa khỏi 'quicklabdump' ở đây và @I__ đang xóa khỏi' cte' không? – cctan

+0

@cctan - cte là một bí danh được thiết lập bằng câu lệnh with. –

+0

@ClintGood cảm ơn bạn rất nhiều vì điều này. bạn có thể vui lòng cho tôi biết tôi sẽ cần phải chạy điều này nhiều lần nếu có nhiều hơn 2 bản sao [id mẫu]? ví dụ: spec123, spec123 và spec123, với quicklabdumpid 1, 2, 3 –

Các vấn đề liên quan