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 个问题,
- 为什么我需要 运行 它不止一次才能找到更多重复项?
- 为什么它找不到所有重复项,无论重复多少次运行?
我假设 cte 函数存在缺陷,但我正在努力发现它,感谢您的帮助!
ORDER BY 允许第一个位置有零值。这些值不会被删除(WHERE RN > 1 且 [values] = 0)。在 non-zero 数字到达第一个位置
之前可能需要多次迭代
将 ORDER BY 更改为 a.value DESC
以上假定non-zero值为正数(如图所示)。如果 non-zero [value] 可以是正数或负数,则需要按绝对值排序:ABS(a.value)
我有以下要求删除任何重复的零值行,其中存在具有非零值的匹配行。匹配案例在所有其他列上完成。
例如,
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 个问题,
- 为什么我需要 运行 它不止一次才能找到更多重复项?
- 为什么它找不到所有重复项,无论重复多少次运行?
我假设 cte 函数存在缺陷,但我正在努力发现它,感谢您的帮助!
ORDER BY 允许第一个位置有零值。这些值不会被删除(WHERE RN > 1 且 [values] = 0)。在 non-zero 数字到达第一个位置
之前可能需要多次迭代将 ORDER BY 更改为 a.value DESC
以上假定non-zero值为正数(如图所示)。如果 non-zero [value] 可以是正数或负数,则需要按绝对值排序:ABS(a.value)