从 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 表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从表中的多个重复项中删除特定记录

sql 从SQL表中删除重复项

从具有 NULL 列的大表中删除重复项,这也需要考虑

如何根据某个字段从数据库表中删除重复项

了解从链表中删除重复项的复杂性

从 MySQL 中的大表中删除重复项的最快过程是啥