我有以下要求来删除任何重复的零值行,其中存在具有非零值的匹配行。匹配情况在所有其他列上完成。
例如
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
所以我有两个问题,
- 为什么我需要多次运行它才能找到更多重复项
- 为什么不管运行多少次,它都找不到所有重复项
我认为cte函数有缺陷,但我很难发现,感谢您的帮助!
将ORDER BY更改为a.value DESC
以上假设非零值为正数(如图所示(。如果非零[值]可以是正或负,则需要按绝对值排序:ABS(a.value(