Sql 红移:表中相同ID的多行,是否放弃旧行?
我有一张红移的表my_表,如下所示:Sql 红移:表中相同ID的多行,是否放弃旧行?,sql,amazon-redshift,Sql,Amazon Redshift,我有一张红移的表my_表,如下所示: id, update_time, value abc, 2019-10-01 05:05:05, 20 xyz, 2020-01-22 01:02:03, 40 abc, 2019-11-11 15:15:15, 40 jul, 2020-05-05 02:02:02, 55 id abc有两行,我只想在表中保留具有最新更新时间值的行,删除其余的行。使用类似这样的方法: CREATE TEMP TABLE foo as SELECT *, ROW_NUM
id, update_time, value
abc, 2019-10-01 05:05:05, 20
xyz, 2020-01-22 01:02:03, 40
abc, 2019-11-11 15:15:15, 40
jul, 2020-05-05 02:02:02, 55
id abc有两行,我只想在表中保留具有最新更新时间值的行,删除其余的行。使用类似这样的方法:
CREATE TEMP TABLE foo as
SELECT *, ROW_NUMBER OVER (PARTITION BY id ORDER BY update_time DESC) AS row_number FROM my_table
给予
现在我可以识别最新的一行,它的行数为1。如何使用此选项从原始表(即从我的_表)中删除行?或者有更好的方法吗?使用子查询,其中:
编辑:
对于删除,您可以使用:
Gordon的答案比我下面建议的更自然的解决方法是为行创建一些唯一的Id,而不是表中不唯一的Id。所以,我想这样的方法应该行得通 编号为 选择id+更新时间id\u 1 ,分区上的行数按id顺序按更新时间描述为rn 从我的桌子上 从my_表中删除 其中id+更新时间在 选择id_1 从编号 其中rn>1 但是当第一行和下几行的id和datetime相同时,它会产生冲突,这种情况下,这个查询会删除冲突中的所有数据Gordon的答案也是如此,但部分原因是不删除这些重复项 因此,您需要分析表中的此类冲突 选择计数* 从…起 选择id+更新时间 ,按id+更新时间为rn的分区上的行数 从我的桌子上 其中rn>1
如果此查询未返回任何内容,则您是安全的,可以运行删除查询。否则,您需要在新id中植入一些其他字段以使其唯一,例如id+update_time+value as id_1嘿,谢谢,但我希望从原始表中删除行,而不是临时表中的行。我该怎么做呢?
id, update_time, value, row_number
abc, 2019-10-01 05:05:05, 20, 2
xyz, 2020-01-22 01:02:03, 40, 1
abc, 2019-11-11 15:15:15, 40, 1
jul, 2020-05-05 02:02:02, 55, 1
CREATE TEMP TABLE foo as
SELECT t.*
FROM (SELECT t.*,
ROW_NUMBER OVER (PARTITION BY id ORDER BY update_time DESC) AS row_number
FROM my_table t
) t
WHERE row_number = 1;
delete from my_table
using (select t.id, max(t.update_time) as max_ut
from my_table t
group by t.id
) tt
where my_table.id = tt.id and
my_table.update_time < tt.max_ut;