CTE Row_Number分区不会删除所有重复项



我有以下要求来删除任何重复的零值行,其中存在具有非零值的匹配行。匹配情况在所有其他列上完成。

例如

values  |   type    | month_year |   cli_name  |  media  |  ordering
50      | Revenue   |  Nov_20    |   google    | agency  |  sample
0       | Revenue   |  Nov_20    |   google    | agency  |  sample

我希望删除此处的零行,因为type、month_year、cli_name、media、ordering列上有一个匹配的行,而values列不为零。

为了做到这一点,我有以下cte功能,

WITH CTE AS(
SELECT a.*,ROW_NUMBER() OVER (PARTITION BY a.type, a.month_year, a.cli_name, a.media, a.ordering
ORDER BY  a.type, a.month_year, a.cli_name, a.media, a.ordering)as RN
FROM mytable a
)
DELETE FROM CTE WHERE RN > 1 and [values] = 0

函数的行为非常奇怪。第一次运行时,它只删除一部分重复项。我需要再运行几次,每次,它都会收集更多的重复并删除它们,直到我运行它(在我的场景中,是第4次(,它不再删除为止。这里的问题是重复的零值行仍然保留在表中。

我知道情况是这样的,因为在cte函数停止查找/删除重复项后,运行以下查询仍然会返回结果:

SELECT DISTINCT b.[values],a.[values], b.[type], b.month_year, b.cli_name, b.media, b.ordering 
FROM mytable a
JOIN mytable   b    on b.[type] = a.[type]
and b.month_year= a.month_year
and b.cli_name= a.cli_name
and b.media = a.media
and b.ordering= a.ordering
where a.[values] <> 0 and b.[values] = 0

所以我有两个问题,

  1. 为什么我需要多次运行它才能找到更多重复项
  2. 为什么不管运行多少次,它都找不到所有重复项

我认为cte函数有缺陷,但我很难发现,感谢您的帮助!

ORDER BY允许在第一个位置为零值。这些值将不会被删除(WHERE RN>1并且[values]=0(。在非零值到达的第一个位置之前,可能需要几次迭代

将ORDER BY更改为a.value DESC

以上假设非零值为正数(如图所示(。如果非零[值]可以是正或负,则需要按绝对值排序:ABS(a.value(

最新更新