将多个记录合并为一个记录

时间:2016-10-14 22:43:20

标签: sql postgresql

我有以下查询为单个ID生成多个记录。我试图弄清楚如何将这些多个记录合并到一个记录中:

SELECT DISTINCT id, gender, dateofbirth, city, state, zip
FROM t

这可能会给我以下结果集:

1, M, 2000-01-01, dallas, tx, 12345
1, M, 2000-01-01, NULL, NULL, NULL

我想要的是一条记录:

1, M, 2000-01-01, dallas, tx, 12345

当第二行具有不同的数据时会发生类似的情况:

1, M, 2000-01-01, dallas, tx, 12345
1, M, 2000-01-01, houston, tx, 67890

在这种情况下,我只想选择其中一条记录而忽略另一条记录,以便每个id只有一条记录。

有没有办法在PostgreSQL中执行此操作?我试过联合无济于事,并且想知道是否有办法解决这个问题。

2 个答案:

答案 0 :(得分:1)

以下查询似乎正在运行,至少对于您的示例数据而言。看看下面的小提琴演示。我使用MySQL,因为Fiddle倾向于打破任何其他数据库类型。

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT id, MAX(city || ', ' || state || ', ' || zip) AS location
    FROM yourTable
    GROUP BY id
) t2
    ON t1.id = t2.id AND
       t1.city || ', ' || t1.state || ', ' || t1.zip = t2.location

SQLFiddle

我使用的技巧是将city,state和zip连接成一个字符串,然后选择id组值的最大值。假设不可能以某种方式从两个不同的地址形成相同的字符串,这将起作用。我认为这适用于您的美国地址格式。

答案 1 :(得分:0)

@posts

上述查询将始终返回一个id的记录。如果city有多个值,一个值为value,另一个值为null,则查询将获取具有city值的记录。