SQL-合并具有相似值的两行
我有一个名为PostgreSQL server中的区域的下表: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 |
| 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
);