簡體   English   中英

SQL Server 2008-使用ROW_NUMBER查找重復項

[英]SQL Server 2008 - Finding duplicates using ROW_NUMBER

我有以下SQL可以查找重復項

SELECT  *
FROM (SELECT
      id,
      ShipAddress,
      ShipZIPPostal,
      ROW_NUMBER() OVER (PARTITION BY shipaddress, shipzippostal ORDER BY shipaddress) ROWNUM
FROM orders
WHERE CONVERT(date, orderdate) = CONVERT(date, GETDATE())) x
WHERE rownum > 1

我只想查看行,如果Rownum的值> 1,那么我想查看其對應的行,其中rownum = 1。

所以基本上,如果一行中有重復項,我想查看原始行及其所有重復項。

如果一行沒有重復,那么我不想看到它(它將具有rownum = 1)

請問我該怎么辦?

干杯

使用count(*)而不是row_number()

SELECT *
FROM (SELECT id, ShipAddress, ShipZIPPostal,
             COUNT(*) OVER (PARTITION BY shipaddress, shipzippostal) as cnt
      FROM orders
      WHERE CONVERT(date, orderdate) = CONVERT(date, GETDATE())
     ) x
WHERE cnt > 1;

除了戈登的答案之外,如果您出於某些學術原因想要保留row_number()方法,則可以執行以下操作:

SELECT  *
FROM (SELECT
      id,
      ShipAddress,
      ShipZIPPostal,
      ROW_NUMBER() OVER (PARTITION BY shipaddress, shipzippostal ORDER BY shipaddress) ROWNUM
FROM orders
WHERE CONVERT(date, orderdate) = CONVERT(date, GETDATE())) x
WHERE EXISTS(
 SELECT * FROM x x2
 WHERE x.shipaddress=x2.shipaddress
 AND x.shipzippostal=x2.shipzippostal
 AND x2.ROWNUM>1
)

我個人實際上更喜歡這樣的CTE結構:

WITH cte AS (
  SELECT
      id,
      ShipAddress,
      ShipZIPPostal,
      ROW_NUMBER() OVER (PARTITION BY shipaddress, shipzippostal ORDER BY shipaddress) ROWNUM
  FROM orders
  WHERE CONVERT(date, orderdate) = CONVERT(date, GETDATE())
) 
SELECT  *
FROM cte
WHERE EXISTS(
 SELECT * FROM cte x2
 WHERE cte.shipaddress=x2.shipaddress
 AND cte.shipzippostal=x2.shipzippostal
 AND x2.ROWNUM>1
)

您可以添加第二個row_number,但是將順序更改為ID,以使其有所不同,然后比較2個row_numbers

SELECT
    *
FROM
    (SELECT
        id,
        ShipAddress,
        ShipZIPPostal,
        ROW_NUMBER() OVER (PARTITION BY shipaddress,shipzippostal ORDER BY id) ROWNUM1,
        ROW_NUMBER() OVER (PARTITION BY shipaddress,shipzippostal ORDER BY id DESC) ROWNUM2
     FROM
        orders
     WHERE
        CONVERT(DATE,orderdate) = CONVERT(DATE,GETDATE())
    ) x
WHERE
    ROWNUM1 <> ROWNUM2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM