netezza 删除具有不同时间戳字段的记录,其中特定字段相同

Posted

技术标签:

【中文标题】netezza 删除具有不同时间戳字段的记录,其中特定字段相同【英文标题】:netezza delete records with different timestamp field where specific fields are the same 【发布时间】:2015-07-24 14:12:12 【问题描述】:

我有一个 netezza 表,其中数据在更新时可能会重叠,但是每个关联的 timestamp 字段会有所不同。例如:

+-----------------+---------+-------------+------+ | ts |第一纳米 |最后_nm​​ |值 | +-----------------+---------+-------------+------+ | 2015 年 4 月 1 日下午 4:15 |本 |布卢明顿| 12 | | 2015 年 4 月 1 日下午 4:20 |本 |布卢明顿| 4.5 | | 2015 年 4 月 1 日下午 4:20 |安德鲁 |彭博| 2.8 | +-----------------+---------+-------------+------+

我想保留以下记录并删除本布卢明顿较早的时间戳

+-----------------+---------+-------------+------+ | ts |第一纳米 |最后_nm​​ |值 | +-----------------+---------+-------------+------+ | 2015 年 4 月 1 日下午 4:20 |本 |布卢明顿| 4.5 | | 2015 年 4 月 1 日下午 4:20 |安德鲁 |彭博| 2.8 | +-----------------+---------+-------------+------+

所以,基于 first_nmlast_nm 的不同,我如何才能保持最新的 ts 具有最新的值?

我想我可以使用row_number() 函数,但我不确定如何在我的delete 语句中实现它。

【问题讨论】:

你能做这样的事情吗 - 创建表 t2 作为 select MAX(ts) ts, first_nm, last_nm from t1 group by first_nm, last_nm;如果你的桌子上没有身份证? 我想用一个临时表做类似的事情,然后删除表并重新插入记录,但是随着这个表的增长,我担心它可能会变得性能不佳,尽管我想我是不确定。 随着表的增长,截断替换策略可能会为执行夜间增量备份的 dba 创建大量数据。因此,只删除您关心的记录应该会让 dba 满意。 eek,是的,我很担心这样的事情,谢谢@niederee! 【参考方案1】:

您可以使用以下示例删除所有不是最新时间戳的行。我添加了窗口函数row_number()作为例子。

delete from <table>
where rowid in
   (
select rwid
from (  select rowid as rwid
        , row_number() over(partition by first_nm,last_nm order by ts desc) as rown
        from <table>
     ) sub
where sub.rown>1
   );

【讨论】:

rowid 是每行数据唯一的内部列。 rowid documentation【参考方案2】:

应该做同样的更短的解决方案是:

 DELETE FROM table t
 WHERE 
   EXISTS (SELECT * FROM table 
           WHERE t.rwid < rwid 
             AND t.first_nm = first_nm 
             AND t.last_nm = last_nm)

【讨论】:

以上是关于netezza 删除具有不同时间戳字段的记录,其中特定字段相同的主要内容,如果未能解决你的问题,请参考以下文章

Netezza - 从 SQL 语句中获取已删除记录的计数

如果 PIG 中的第二个字段具有不同的值,如何过滤/删除记录

Netezza SQL 比较同一表中的两条记录

如何从具有最后时间戳的数据框中选择不同的记录

如何在 Netezza(Aginity) 中删除这些记录

带时间戳的逻辑删除