在SQL中删除几乎重复的行

时间:2015-06-02 17:25:33

标签: sql-server

我在网上找到了很多关于如何删除SQL表中重复行的示例,但我无法弄清楚如何删除几乎重复的行。

数据示例

+--------+----------+--------+
|  Col1  |   Col2   | NumCol |
+--------+----------+--------+
| USA    | Organic  |    300 |
| USA    | Organic  |    400 |
| Canada | Referral |    120 |
| Canada | Referral |    120 |
+--------+----------+--------+

期望输出

+--------+----------+--------+
|  Col1  |   Col2   | NumCol |
+--------+----------+--------+
| USA    | Organic  |    400 |
| Canada | Referral |    120 |
+--------+----------+--------+

在这个例子中,如果2行相同,那么我希望删除其中一行。另外,如果基于Col1和Col2匹配2行,那么我希望删除NumCol中值较小的行。

我的SQL Server Express代码是:

    WITH CTE AS(
      SELECT [Col1]
        ,[Col2]
        ,[NumCol]
        , RN = ROW_NUMBER()OVER(PARTITION BY [Col1]
        ,[Col2]
        ,[NumCol] ORDER BY [Col1])
     FROM table
    )
    DELETE FROM CTE WHERE RN > 1

此代码可以很好地删除重复项,但它不会删除只有Col1和Col2匹配但不匹配NumCol的行。我应该怎样处理这样的事情?我是SQL的新手,所以对外行人的任何解释都表示赞赏!

1 个答案:

答案 0 :(得分:2)

您可以通过更改:

让每个(Col1, Col2)对重新开始行号
RN = ROW_NUMBER()OVER(PARTITION BY [Col1]
    ,[Col2]
    ,[NumCol] ORDER BY [Col1])

要:

RN = ROW_NUMBER() OVER(
  PARTITION BY Col1, Col1 
  ORDER BY NumCol desc)

order by NumCol desc可确保删除NumCol较低的行。