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:20 |本 |布卢明顿| 4.5 | | 2015 年 4 月 1 日下午 4:20 |安德鲁 |彭博| 2.8 | +-----------------+---------+-------------+------+所以,基于 first_nm
和 last_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 删除具有不同时间戳字段的记录,其中特定字段相同的主要内容,如果未能解决你的问题,请参考以下文章