Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 红移:表中相同ID的多行,是否放弃旧行?_Sql_Amazon Redshift - Fatal编程技术网

Sql 红移:表中相同ID的多行,是否放弃旧行?

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

我有一张红移的表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_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;