在PostgreSQL中合并行
以下是我的数据:在PostgreSQL中合并行,sql,postgresql,merge,aggregate-functions,Sql,Postgresql,Merge,Aggregate Functions,以下是我的数据: ID FName LName data1 data2 1 John Doe xxx1 2 John Doe xxx2 yyy2 下面是我想要的结果: ID FName LName data1 data2 1 John Doe xxx1 yyy2 简言之,我有一个表,其中有很多人,该表由多个具有不同数据和ID的源填充。我想要的是,对于我
ID FName LName data1 data2
1 John Doe xxx1
2 John Doe xxx2 yyy2
下面是我想要的结果:
ID FName LName data1 data2
1 John Doe xxx1 yyy2
简言之,我有一个表,其中有很多人,该表由多个具有不同数据和ID的源填充。我想要的是,对于我找到的每个重复项,以及对于表视图中的每个列,如果该单元格中存在数据,则尝试将其转储到该人员的最旧记录中,如果有数据,则不执行任何操作
我不知道我是否讲清楚了
最好的方法是什么?我应该编写一个存储过程,还是可以通过一个我还没有想到的智能查询来完成它?您可以创建这样的自定义聚合:
CREATE FUNCTION remember_first(acc text, newval text) RETURNS text AS $$
BEGIN
RETURN COALESCE(acc, newval);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE AGGREGATE first(text) (
sfunc = remember_first,
stype = text
);
它将返回第一个NOTNULL值。然后:
SELECT FName, LName, first(data1), first(data2)
FROM your_table
GROUP BY FName, LName
ORDER BY FName, LName, id -- or your ordering columns
以获取所需的数据。最后-只需使用此选择更新记录。或者只创建一个包含所需数据的视图
另外,聚合函数来自您可以创建如下自定义聚合:
CREATE FUNCTION remember_first(acc text, newval text) RETURNS text AS $$
BEGIN
RETURN COALESCE(acc, newval);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE AGGREGATE first(text) (
sfunc = remember_first,
stype = text
);
它将返回第一个NOTNULL值。然后:
SELECT FName, LName, first(data1), first(data2)
FROM your_table
GROUP BY FName, LName
ORDER BY FName, LName, id -- or your ordering columns
以获取所需的数据。最后-只需使用此选择更新记录。或者只创建一个包含所需数据的视图
另外,聚合函数来自,您可以通过使用联接和:
尝试使用真实数据和Igor的自定义聚合测试此方法,看看哪个性能更好。您可以通过使用联接和: 尝试使用您的真实数据对Igor的定制聚合测试此方法,以查看哪个性能更好