我在网上找到了很多关于如何删除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的新手,所以对外行人的任何解释都表示赞赏!
答案 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
较低的行。