使用 Postgres SQL 在不复制的情况下合并两个不同的表
Combine two different tables Without Duplicating using Postgres SQL
我正在处理一个查询,我应该合并 2 tables 并将每个用户作为一个单独的条目(用户不应重复)。对于日期,我需要从这 2 tables
中获取最新的
table 1
table 2
预期输出(我需要合并两个 tables 并将用户的数据作为单个条目获取,对于日期,我需要获取这 2 tables)
中的最新日期
user_id name date
----------------------------------
1 John 2020-10-29 --The latest date--
2 Tom 2020-11-15 --The latest date--
3 Peter 2020-12-10 --The latest date--
实际输出
我的postgresql
SELECT user_id, name, date
FROM
table_1
UNION
SELECT user_id, name, date
FROM
table_2
我尝试了很多方法,但没有任何效果。进行合并时数据重复。谁能帮帮我
使用 UNION ALL 组合两个表,然后应用 ROW_NUMBER() 序列化 user_id 具有降序日期的明智值。然后使用 CTE 检索最后一条记录。使用 UNION ALL 避免额外排序。
-- PostgreSQL
WITH c_cte AS (
SELECT t.*
, ROW_NUMBER() OVER (PARTITION BY t.user_id ORDER BY t.date DESC) row_num
FROM (SELECT user_id, name, date
FROM table_1
UNION ALL
SELECT user_id, name, date
FROM table_2) t
)
SELECT user_id, name, date
FROM c_cte
WHERE row_num = 1
ORDER BY user_id
还有另一种不用 CTE 做同样事情的方法
SELECT u.user_id, u.name, u.date
FROM (SELECT t.*
, ROW_NUMBER() OVER (PARTITION BY t.user_id ORDER BY t.date DESC) row_num
FROM (SELECT user_id, name, date
FROM table_1
UNION ALL
SELECT user_id, name, date
FROM table_2) t
) u
WHERE u.row_num = 1
ORDER BY u.user_id
我正在处理一个查询,我应该合并 2 tables 并将每个用户作为一个单独的条目(用户不应重复)。对于日期,我需要从这 2 tables
中获取最新的table 1
table 2
预期输出(我需要合并两个 tables 并将用户的数据作为单个条目获取,对于日期,我需要获取这 2 tables)
中的最新日期user_id name date
----------------------------------
1 John 2020-10-29 --The latest date--
2 Tom 2020-11-15 --The latest date--
3 Peter 2020-12-10 --The latest date--
实际输出
我的postgresql
SELECT user_id, name, date
FROM
table_1
UNION
SELECT user_id, name, date
FROM
table_2
我尝试了很多方法,但没有任何效果。进行合并时数据重复。谁能帮帮我
使用 UNION ALL 组合两个表,然后应用 ROW_NUMBER() 序列化 user_id 具有降序日期的明智值。然后使用 CTE 检索最后一条记录。使用 UNION ALL 避免额外排序。
-- PostgreSQL
WITH c_cte AS (
SELECT t.*
, ROW_NUMBER() OVER (PARTITION BY t.user_id ORDER BY t.date DESC) row_num
FROM (SELECT user_id, name, date
FROM table_1
UNION ALL
SELECT user_id, name, date
FROM table_2) t
)
SELECT user_id, name, date
FROM c_cte
WHERE row_num = 1
ORDER BY user_id
还有另一种不用 CTE 做同样事情的方法
SELECT u.user_id, u.name, u.date
FROM (SELECT t.*
, ROW_NUMBER() OVER (PARTITION BY t.user_id ORDER BY t.date DESC) row_num
FROM (SELECT user_id, name, date
FROM table_1
UNION ALL
SELECT user_id, name, date
FROM table_2) t
) u
WHERE u.row_num = 1
ORDER BY u.user_id