【问题标题】:Join two tables side by side并排连接两个表
【发布时间】:2021-12-23 00:46:16
【问题描述】:

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

表 A

id date
1 03/01/2021
1 04/01/2021
1 05/01/2021
2 04/01/2021
2 05/01/2021
3 03/01/2021
3 04/01/2021

表 B

id date
1 03/01/2021
1 04/01/2021
1 05/01/2021
1 06/01/2021
2 04/02/2021
2 05/02/2021
3 03/01/2021

输出将是

id dateA dateB
1 03/01/2021 03/01/2021
1 04/01/2021 04/01/2021
1 05/01/2021 05/01/2021
1 06/01/2021
2 04/01/2021 04/02/2021
2 05/01/2021 05/02/2021
3 03/01/2021 03/01/2021
3 04/01/2021

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

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

我通过 pandas 使用 sqlite

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

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

添加 group by 会使表只输出每个多的第一条记录

【问题讨论】:

  • 请分享您的 SQL 语句。
  • 添加了我使用的join语句

标签: sql sqlite union common-table-expression window-functions


【解决方案1】:

使用 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;

请参阅demo

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

【讨论】:

  • 玩了一下演示,这看起来像我需要的。这里对我来说有一些新概念,所以我需要首先掌握它们的作用,但我会将其标记为答案,因为它已经与所需的输出相匹配。谢谢@forpas
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2019-10-12
  • 1970-01-01
  • 2023-04-09
  • 2014-11-11
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多