Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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-合并具有相似值的两行_Sql_Postgresql - Fatal编程技术网

SQL-合并具有相似值的两行

SQL-合并具有相似值的两行,sql,postgresql,Sql,Postgresql,我有一个名为PostgreSQL server中的区域的下表: | id | name | code | shape | created | cars ======================================================= | 1 | name 1 | code 1 | shape 1 | created1 | cars 1 | 2 | name 1 | code 1 | shape 2 | created2 | NULL |

我有一个名为PostgreSQL server中的区域的下表:

| id | name    | code    | shape   | created  | cars
=======================================================
| 1  | name 1  | code 1  | shape 1 | created1 | cars 1
| 2  | name 1  | code 1  | shape 2 | created2 | NULL
| 3  | name 2  | code 2  | shape 3 | created3 | cars 2
| 4  | name 2  | code 2  | shape 4 | created4 | NULL
.
.
.
所以基本上,它几乎是重复的条目,具有相同的名称和代码,但不同的id、形状和创建的时间戳。我想要的是合并那些重复的行,但是用最新条目的值覆盖形状和创建的字段。因此,最终上表将如下所示:

| id | name    | code    | shape   | created  | cars
======================================================
| 1  | name 1  | code 1  | shape 2 | created2 | cars 1
| 3  | name 2  | code 2  | shape 4 | created4 | cars 2
.
.
.
有没有办法做到这一点?有一个限制,即表中已经存在重复的、较新的条目,因此不可能仅通过插入新条目来更新以前的条目。
我希望以后将结果存储在同一个表中。

一种方法使用数组实现第一个聚合函数:

select id, name, code, max(created),
       (array_agg(shape order by created desc))[1] as shape,
       max(cars) as cars
from t
group by id, name, code;
分两步进行:

使用后面的ID更新下面的ID 删除以后不再需要的ID。
如果有两个以上的副本,您将遇到一个问题:您应该使用上面的哪一个来进行更新?

这可以用于检索我期望的结果。我想知道以后如何将它们存储在同一张表中,而不是仅仅检索它们。我想可能是update语句的组合。@kon176。这也需要删除行。我建议您运行此查询,将结果存储在临时表中。然后截断原始表并重新插入固定行。除非要保留ID?,否则不需要覆盖。只要保留你想保留的记录,[=删除你不想保留的记录]我想覆盖,所以我保留了ID。所以这是部分覆盖。我想保留旧条目的id和从新条目创建的形状。请注意,与您的声明相反,重复项的id是不同的。这是通过使用标识列来实现的。因此,您希望引入一个新列,它是旧dup中填充的重复列,指向新dup行。创建一个视图,其中cars不为NULL,并结合滞后或超前窗口功能。
UPDATE ztable dst
SET shape = src.shape
        , created = src.created
FROM ztable src
WHERE src.name = dst.name
AND src.code = dst.code
AND src.id > dst.id
        ;

DELETE FROM ztable del
WHERE EXISTS ( SELECT *
        FROM ztable x
        WHERE x.name = del.name
        AND x.code = del.code
        AND x.id < del.id
        );