2012-06-20 54 views
5

Tôi có một bảng có một số hàng trùng lặp trong đó. Tôi chỉ muốn xóa một hàng trùng lặp.truy vấn sql để xóa chỉ một hàng trùng lặp

Ví dụ: I'v 9 hàng trùng lặp nên chỉ xóa một hàng và sẽ hiển thị 8 hàng còn lại.

dụ

ngày gọi điện thoại gọi thời gian timestampp

2012-06-19 10:22:45.000 165 218 155 1.9 121 
2012-06-19 10:22:45.000 165 218 155 1.9 121 
2012-06-19 10:22:45.000 165 218 155 1.9 121 
2012-06-19 10:22:45.000 165 218 155 1.9 121 

từ thành phố Ngày nên xóa chỉ có một hàng và sẽ hiển thị 3 hàng

2012-06-19 10:22:45.000 165 218 155 1.9 100 
2012-06-19 10:22:45.000 165 218 155 1.9 100 
2012-06-19 10:22:45.000 165 218 155 1.9 100 

từ thành phố Ngày nên xóa chỉ có một hàng và nên hiển thị 2 hàng

Tôi làm cách nào để thực hiện việc này?

+0

bạn có thể định dạng dữ liệu để dữ liệu dễ đọc hơn không? – codingbiz

+0

Có năm tên cột được liệt kê nhưng có sáu cột ở đầu ra. Và cột cuối cùng thay đổi từ 121 đến 100 như thế nào? Nếu nguồn có hai hàng với 121 và hai hàng với 100, bạn sẽ xóa hai hàng hay một hàng? (Nói cách khác, là trùng lặp dựa trên ngày một mình?) –

Trả lời

1

Bạn có khóa chính trên bàn không?

Điều gì tạo nên một hàng trùng lặp? Đồng thời? cùng ngày? tất cả các cột đều giống nhau không?

Nếu bạn có một khóa chính, bạn có thể sử dụng chức năng TOP để chọn chỉ một bản ghi và xóa một hàng:

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause]) 
3

Nếu bạn không nhớ thứ tự của các hàng có một lệnh trong MySQL:

DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5}; 
+0

và tất nhiên bạn có thể sử dụng câu lệnh WHERE thene để chỉ định ngày cần xóa. – Reshi

+2

OP đã yêu cầu giải pháp SQL Server. – Spikeh

1

Đối với SQL server 2005 + bạn có thể làm như sau:

;WITH CTE AS 
(
    SELECT *, 
      ROW_NUMBER() OVER(PARTITION BY [date], calling, called, duration, [timestamp] ORDER BY 1) RN 
    FROM YourTable 
) 
DELETE FROM CTE 
WHERE RN = 2 
6

giải pháp này cho phép bạn để xóa một hàng từ mỗi bộ bản sao (thay vì chỉ xử lý một khối duy nhất của bản sao tại một thời điểm):

;WITH x AS 
(
    SELECT [date], rn = ROW_NUMBER() OVER (PARTITION BY 
    [date], calling, called, duration, [timestamp] 
    ORDER BY [date]) 
    FROM dbo.UnspecifiedTableName 
) 
DELETE x WHERE rn = 2; 

Là một sang một bên, cả hai [date][timestamp] là sự lựa chọn khủng khiếp cho tên cột ...

+0

whats ý nghĩa của; VỚI x AS ?? – user2705620

+0

@ User6675636b20796f7521 Nó được gọi là [Biểu thức bảng chung] (http://msdn.microsoft.com/en-us/library/ms175972.aspx). –

+0

Cảm ơn :) đây là một giải pháp tốt. – user2705620

0

Vì tôi không có lược đồ, tôi muốn một giải pháp khả thi trong các bước:

  1. Áp dụng một số hàng đến lựa chọn của tất cả các cột
  2. Thực hiện một nhóm bởi với những cột và xóa mi n (rownumber) trong mỗi nhóm

Edit:

Các rownumber là trong một truy vấn bên trong và sẽ có rownumber incrementing trong tất cả các hàng. Trong truy vấn bên ngoài, tôi tạo nhóm bằng truy vấn bên trong và chọn min (rownumber) cho mỗi nhóm. Vì mỗi nhóm được tạo thành bởi các hàng trùng lặp, tôi sau đó loại bỏ min (rownumber) cho mỗi nhóm.

+1

MIN sẽ luôn là 1 cho mỗi nhóm, nếu được phân đoạn bởi cùng một cột. Điều này có nghĩa là bạn cũng sẽ xóa các hàng * không * có bản sao, trừ khi bạn cũng thêm HAVING. Mà làm cho nó thậm chí còn phức tạp hơn so với các giải pháp đã được đăng, IMHO. –

+0

@AaronBertrand nop, số rownumber nằm trong truy vấn bên trong và sẽ tăng số lần tăng lên trong tất cả các hàng. Trong truy vấn bên ngoài, tôi tạo nhóm bằng truy vấn bên trong và chọn min (rownumber) cho mỗi nhóm. Vì mỗi nhóm được tạo thành bởi các hàng trùng lặp, tôi sau đó loại bỏ min (rownumber) cho mỗi nhóm. Bạn có hiểu không? –

+0

Với mô tả tốt hơn, chắc chắn, nhưng nó không khớp với mô tả đầu tiên của bạn. Mã sẽ hữu ích hơn và tự giải thích hơn. –

0

sử dụng LIMIT 1 sẽ giúp bạn xóa chỉ 1 ROW phù hợp DELETE truy vấn của bạn:

DELETE FROM `table_name` WHERE `column_name`='value' LIMIT 1; 

TRƯỚC:

+----------------------+ 
| id | column_name | 
+-----+----------------+ 
| 1 | value   | 
+-----+----------------+ 
| 2 | value   | 
+-----+----------------+ 
| 3 | value   | 
+-----+----------------+ 
| 4 | value   | 
+-----+----------------+ 

SAU:

+----------------------+ 
| id | column_name | 
+-----+----------------+ 
| 1 | value   | 
+-----+----------------+ 
| 2 | value   | 
+-----+----------------+ 
| 3 | value   | 
+-----+----------------+ 
Các vấn đề liên quan