CTE Row_Number 分区没有删除所有重复项

CTE Row_Number partition doesn't remove all duplicates

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

例如,

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

我想删除这里的零行,因为在类型month_year、cli_name、媒体、排序列上有匹配的行,并且值列不为零。

为了做到这一点,我有以下 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 次)并且它不会删除了。这里的问题是重复的零值行仍然保留在 table.

我知道是这种情况,因为在 cte 函数停止后 运行 以下查询仍然 returns 结果 finding/removing 重复:

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

所以我有 2 个问题,

  1. 为什么我需要 运行 它不止一次才能找到更多重复项?
  2. 为什么它找不到所有重复项,无论重复多少次运行?

我假设 cte 函数存在缺陷,但我正在努力发现它,感谢您的帮助!

ORDER BY 允许第一个位置有零值。这些值不会被删除(WHERE RN > 1 且 [values] = 0)。在 non-zero 数字到达第一个位置

之前可能需要多次迭代

将 ORDER BY 更改为 a.value DESC

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