sql - 合并 PostgreSQL 中的行

标签 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。我想要的是,对于我找到的每个重复项以及 TableView 中的每一列,如果该单元格中存在数据,那么,如果存在,请尝试将其转储到该人的最旧记录(如果有数据),什么也不做。

不知道我有没有说清楚。

执行此操作的最佳方法应该是什么?我应该编写一个存储过程还是可以通过我还没有想到的巧妙查询来完成?

最佳答案

您可以通过使用联接和 window functions 的查询来解决此问题:

select nodups.id, nodups.fname, nodups.lname, d1.data1, d2.data2
from
  (select min(id) as id, fname, lname from sample group by fname, lname) nodups
left join
  (select fname, lname, min(data1) as data1
   from (select fname, lname
           , first_value(data1) over (partition by fname, lname order by id) as data1
         from sample where data1 is not null) d1x
   group by fname, lname
  ) d1 using (fname, lname)
left join
  (select fname, lname, min(data2) as data2
   from (select fname, lname
           , first_value(data2) over (partition by fname, lname order by id) as data2
         from sample where data2 is not null) d2x
   group by fname, lname
  ) d2 using (fname, lname)
order by id
;

SQLFiddle

尝试使用您的真实数据与 Igor 的自定义聚合测试此方法,看看哪种方法性能更好。

关于sql - 合并 PostgreSQL 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614251/

相关文章:

sql - 需要帮助将表从 sql server 2008 导出到文本文件

mysql SELECT 超过 1 个或

ruby-on-rails - 运行 rake db 时出错 :create in Docker

python - 将 Pandas 中的数据帧与相同的行和列但不同的单元格值组合

java - 如何使用 Java 将 >1000 个 xml 文件合并为一个文件

c# - 无需外部存储就地合并

php - 将 MySQL 数据分类为限制大小的页面,并在屏幕上选择更改页面?它是如何完成的?

mysql - MySQL 表中的常量列值

Django trigram_similar 搜索未返回结果(Django 2.1 和 Postgresql 10.5 后端)

sql - 用于范围查找的快速表索引