首页 > 解决方案 > 并排连接两个表

问题描述

我有这两张表需要并排加入

表 A

ID 日期
1 2021 年 3 月 1 日
1 2021 年 4 月 1 日
1 2021 年 5 月 1 日
2 2021 年 4 月 1 日
2 2021 年 5 月 1 日
3 2021 年 3 月 1 日
3 2021 年 4 月 1 日

表 B

ID 日期
1 2021 年 3 月 1 日
1 2021 年 4 月 1 日
1 2021 年 5 月 1 日
1 2021 年 6 月 1 日
2 2021 年 4 月 2 日
2 2021 年 5 月 2 日
3 2021 年 3 月 1 日

输出将是

ID 日期A 日期B
1 2021 年 3 月 1 日 2021 年 3 月 1 日
1 2021 年 4 月 1 日 2021 年 4 月 1 日
1 2021 年 5 月 1 日 2021 年 5 月 1 日
1 2021 年 6 月 1 日
2 2021 年 4 月 1 日 2021 年 4 月 2 日
2 2021 年 5 月 1 日 2021 年 5 月 2 日
3 2021 年 3 月 1 日 2021 年 3 月 1 日
3 2021 年 4 月 1 日

基本上,搜索与某个值匹配的所有记录(例如 1,然后将它们并排列出)

我尝试使用 id 作为键加入他们,但它产生了许多我不想要的其他行。也尝试过分组,但顺序混乱

我通过熊猫使用 sqlite

下面的查询导致返回一些额外的行,我不知道如何过滤掉

SELECT 
    A.id, A.date, B.date 
FROM 
    A 
JOIN 
    B ON B.id = A.id

添加分组依据会导致表仅输出每个倍数的第一条记录

标签: sqlsqliteunioncommon-table-expressionwindow-functions

解决方案


使用 CTE 按 id 和日期顺序对两个表的所有行进行排名,然后聚合:

WITH cte AS (
  SELECT id, date dateA, null dateB, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) rn 
  FROM TableA 
  UNION ALL
  SELECT id, null, date, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) rn 
  FROM TableB
)
SELECT id, MAX(dateA) dateA, MAX(dateB) dateB
FROM cte 
GROUP BY id, rn
ORDER BY id, rn;

请参阅演示

请注意,您的日期格式为dd/mm/yyyy,它们不具有可比性。
您应该将它们更改为yyyy-mm-dd以使代码正常工作。


推荐阅读