4

以下を考慮してください。

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

この例では、提供されたデータでサプライヤーが2つの名前として知られているため、製品222が繰り返されます。

私は何千もの製品についてこのようなデータを持っています。重複する製品を削除したり、個々の結果を選択したりするにはどうすればよいですか?SELECT TOP1との自己結合などです。

ありがとう!

4

3 に答える 3

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

これにより、製品ごとに任意の行が選択されます。

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
于 2013-02-15T01:02:15.267 に答える
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
于 2013-02-15T00:57:58.243 に答える
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列が存在する場合はそれを使用できます。

于 2013-02-15T01:01:14.987 に答える