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
在PostgreSQL中合并行_Sql_Postgresql_Merge_Aggregate Functions - Fatal编程技术网

在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的定制聚合测试此方法,以查看哪个性能更好