2013-02-15 2 views
4

рассмотрим ниже:Удалить, где один столбец содержит дубликаты

ProductID Supplier 
--------- -------- 
111  Microsoft 
112  Microsoft 
222  Apple Mac 
222  Apple 
223  Apple 

В этом примере продукт 222 повторяется, поскольку поставщик известен как два имен в предоставленных данных.

У меня есть данные, как это для тысяч продуктов. Как я могу удалить дубликаты продуктов или выбрать отдельные результаты - что-то вроде самостоятельного присоединения к SELECT TOP 1 или что-то в этом роде?

Спасибо!

+0

Какую версию SQL Server? –

+0

Вы можете сделать это с помощью одного DELETE. Только одно, сначала сделайте это. – Popnoodles

ответ

4

Я думаю, что вы хотите сделать следующее:

select t.* 
from (select t.*, 
      row_number() over (partition by product_id order by (select NULL)) as seqnum 
     from t 
    ) t 
where seqnum = 1 

Это выбирает произвольную строку для каждого продукта.

Чтобы удалить все строки, но один, вы можете использовать ту же идею:

with todelete (
     (select t.*, 
       row_number() over (partition by product_id order by (select NULL)) as seqnum 
     from t 
    ) 
delete from to_delete where seqnum > 1 
+0

Гордон, ваше заявление о выборе идеально подходит для меня - спасибо. Есть ли способ использовать максимальную серию группы для эффективного получения последнего результата? Еще раз спасибо! – Warren

4
DELETE a 
FROM tableName a 
     LEFT JOIN 
     (
      SELECT Supplier, MIN(ProductID) min_ID 
      FROM tableName 
      GROUP BY Supplier 
     ) b ON a.supplier = b.supplier AND 
       a.ProductID = b.min_ID 
WHERE b.Supplier IS NULL 

или если вы хотите удалить productID, который имеет более чем onbe продукт

WITH cte 
AS 
(
    SELECT ProductID, Supplier, 
      ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY Supplier) rn 
    FROM tableName 
) 
DELETE FROM cte WHERE rn > 1 
1
;WITH Products_CTE AS 
    (
    SELECT ProductID, Supplier, 
     ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY <some value>) as rn 
    FROM PRODUCTS 
    ) 

SELECT * 
FROM Products_CTE 
WHERE rn = 1 

some value будет ключом, определяющим, какую версию поставщика вы храните. Если вам нужен первый экземпляр поставщика, вы можете использовать столбец DateAdded, если он существует.

Смежные вопросы