PostgreSQL如何合并两个表实现用户去重并获取最新日期
问题原因
你原来使用的UNION只会移除所有字段完全相同的重复行,如果同一个user_id在两个表中对应的date不同,或者同个表内同一个用户有多条不同日期的记录,就会出现多行重复用户数据,不符合需求。
解决方案
方案1:分组聚合(通用SQL写法)
如果确认同一个user_id对应的name完全一致,可以用分组取最大值的写法:
SELECT user_id, MAX(name) AS name, MAX(date) AS date FROM ( SELECT user_id, name, date FROM table_1 UNION ALL SELECT user_id, name, date FROM table_2 ) AS combined GROUP BY user_id ORDER BY user_id;
这里用UNION ALL代替UNION,因为我们后续会做分组聚合,不需要提前去重,查询性能更高。
方案2:PostgreSQL特有DISTINCT ON写法
如果需要保证name是最新日期对应的那一条数据的取值,用PostgreSQL原生的DISTINCT ON语法更简洁精准:
SELECT DISTINCT ON (user_id) user_id, name, date FROM ( SELECT user_id, name, date FROM table_1 UNION ALL SELECT user_id, name, date FROM table_2 ) AS combined ORDER BY user_id, date DESC;
DISTINCT ON (user_id)会为每个唯一的user_id保留一行结果,结合ORDER BY里的date DESC,自动取日期最新的那条记录的所有字段,不会出现name和最新日期不匹配的问题。
内容的提问来源于stack exchange,提问作者M.N. Waleedh
相关产品推荐
相关产品推荐

