sql - 并排连接两个表
问题描述
我有这两张表需要并排加入
表 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
添加分组依据会导致表仅输出每个倍数的第一条记录
解决方案
使用 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
以使代码正常工作。
推荐阅读
- javascript - 将字符串转换为日期时间 Javascript
- javascript - 使用 react-native、Firebase 和 expo 的 signinwithemail 链接错误
- ssl - 使用通配符出口与自定义 CA 进行 TLS 握手
- python - 当用户更改文本字段时,ipyvuetify 捕获文本字段的用户输入值
- haskell - 如何快速检查任意函数
- docker - gitlab-ci:无法在 tcp://docker:2375 连接到 Docker 守护进程。docker 守护进程是否正在运行?
- python - 如何计算半径为 r 的圆在坐标系中占据多少场
- python - 替换字符串中的值 - Python
- html - 如何在网页中创建动态表格
- javascript - 点击事件不适用于内部标签元素