从 Netezza 表中删除重复项
Posted
技术标签:
【中文标题】从 Netezza 表中删除重复项【英文标题】:To Remove Duplicates from Netezza Table 【发布时间】:2016-03-22 15:32:59 【问题描述】:我有一个 type2 表的场景,我必须在总行级别上删除重复项。
让我们将下面的示例视为表中的数据。
A|B|C|D|E
100|12-01-2016|2|3|4
100|13-01-2016|3|4|5
100|14-01-2016|2|3|4
100|15-01-2016|5|6|7
100|16-01-2016|5|6|7
如果您将 A 视为键列,则您知道最后 2 行是重复的。
通常要查找重复项,我们使用按功能分组。
select A,C,D,E,count(1)
from table
group by A,C,D,E
having count(*)>1
对于这个输出将是 100|2|3|4 作为重复,也是 100|5|6|7。 但是,只有 100|5|6|7 仅根据类型 2 而不是 100|2|3|4 重复,因为该值已在第三次运行中返回,而不是在第一次加载后不久。 如果我将日期字段按 100|5|6|7 添加到组中,则不会被视为重复,但实际上确实如此。
如上所述,尝试找出重复项。 重复应该只有 100|5|6|7 而不是 100|2|3|4。 有人可以帮忙处理一下 SQL 吗?
问候 拉加夫
【问题讨论】:
类型2是什么意思? 结果中只有两个重复:100|12-01-2016|2|3|4 > 100|12-01-2016|2|3|4 和 100|15-01 -2016|5|6|7 > 100|16-01-2016|5|6|7 @vkp 我指的是 CDC 类型 2,您可以在其中维护历史记录和当前数据。 我找到了相同的答案。我使用滞后函数来存储以前的值并按日期对其进行排序,因为它是类型 2 表。选择 A,B,lag(C||D||E) over (partition by A order by A,B) as Prev, A||B||C as CURR, case when PREV=CURR then 1 else 0 end as表中的 IND 【参考方案1】:如果您想查看所有重复的行,您需要通过查询将表与您的组连接或使用组查询作为子查询过滤表。
【讨论】:
【参考方案2】:wITH CTE AS (select a, B, C,D,E, count(*)
from TABLE
group by 1,2,3,4,5
having count(*)>1)
sELECT * FROM cte
WHERE B <> B + 1
试试这个查询,看看它是否有效。如果您遇到任何错误,请告诉我。
我假设您的 B 列是日期格式,如果不是,则将其转换为日期
如果您可以看到重复的内容,则只需替换 select * 即可删除
【讨论】:
【参考方案3】:使用 row_number 解析函数去除重复。
delete from
(
select a,b,c,d,e,row_number() over (partition by a,b,c,d,e) as rownumb
from table
) as a
where rownumb > 1
【讨论】:
以上是关于从 Netezza 表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章