匹配两个表,不重复按时间顺序评估
Match two tables without repetition evaluated chronologically
我想匹配 MySQL 数据库中的两个 table。
Table 1
+-----+------------+------+-------+------+
| ID1 | Date1 | Var1 | Group | Var2 |
+-----+------------+------+-------+------+
| 21 | 2021-08-20 | 2 | A | 2 |
| 20 | 2020-11-06 | 2 | A | 6 |
| 23 | 2021-04-13 | 6 | B | 4 |
| 22 | 2020-05-10 | 7 | C | 9 |
| 25 | 2021-09-23 | 4 | C | 1 |
+-----+------------+------+-------+------+
Table 2
+-----+------------+------+-------+
| ID2 | Date2 | VarZ | Group |
+-----+------------+------+-------+
| 6 | 2021-12-29 | 2 | C |
| 4 | 2022-01-15 | 2 | A |
| 5 | 2019-08-02 | 6 | B |
| 9 | 2021-05-02 | 7 | C |
+-----+------------+------+-------+
我正在尝试创建 Table 3,这是按组合并 Table 1 和 Table 2 的结果,其方式来自 Table 的最旧案例1 与 Table 2 的 OLDEST 案例合并,每个案例仅 1 次合并,按时间顺序排列;案例合并后,不应为另一次合并重新评估。最终结果将类似于以下内容:
Table 3
+-----+------------+------+-------+------+-----+------------+------+-------+
| ID1 | Date1 | Var1 | Group | Var2 | ID2 | Date2 | VarZ | Group |
+-----+------------+------+-------+------+-----+------------+------+-------+
| 20 | 2020-11-06 | 2 | A | 6 | 4 | 2022-01-15 | 2 | A |
| 23 | 2021-04-13 | 6 | B | 4 | 5 | 2019-08-02 | 6 | B |
| 22 | 2020-05-10 | 7 | C | 9 | 9 | 2021-05-02 | 7 | C |
| 25 | 2021-09-23 | 4 | C | 1 | 6 | 2021-12-29 | 2 | C |
+-----+------------+------+-------+------+-----+------------+------+-------+
如您所见,只有一个来自 Table 1 的 A 组案例将被合并,因为第二个案例在 Table 1 中具有 A 组,在 Table 中没有任何对应项2.
这实质上是将 Table 1 中的案例与 Table 2 中的案例进行匹配,其中每个案例仅匹配一次,匹配按日期排序,未匹配的案例不会出现在最终 table.
我正在使用 python 和 MySQL。我尝试使用内部联接并按日期变量排序,但无济于事,因为我从一个 table 获取重复案例,如果另一个案例中存在多个案例。非常感谢任何帮助。
您需要 ROW_NUMBER()
window 函数对两个表中每个 Group
的行进行排名,以便您根据该排名加入它们 Group
:
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY `Group` ORDER BY Date1) rn FROM table1) t1
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY `Group` ORDER BY Date2) rn FROM table2) t2
ON t2.`Group` = t1.`Group` AND t2.rn = t1.rn;
参见demo。
我想匹配 MySQL 数据库中的两个 table。
Table 1
+-----+------------+------+-------+------+
| ID1 | Date1 | Var1 | Group | Var2 |
+-----+------------+------+-------+------+
| 21 | 2021-08-20 | 2 | A | 2 |
| 20 | 2020-11-06 | 2 | A | 6 |
| 23 | 2021-04-13 | 6 | B | 4 |
| 22 | 2020-05-10 | 7 | C | 9 |
| 25 | 2021-09-23 | 4 | C | 1 |
+-----+------------+------+-------+------+
Table 2
+-----+------------+------+-------+
| ID2 | Date2 | VarZ | Group |
+-----+------------+------+-------+
| 6 | 2021-12-29 | 2 | C |
| 4 | 2022-01-15 | 2 | A |
| 5 | 2019-08-02 | 6 | B |
| 9 | 2021-05-02 | 7 | C |
+-----+------------+------+-------+
我正在尝试创建 Table 3,这是按组合并 Table 1 和 Table 2 的结果,其方式来自 Table 的最旧案例1 与 Table 2 的 OLDEST 案例合并,每个案例仅 1 次合并,按时间顺序排列;案例合并后,不应为另一次合并重新评估。最终结果将类似于以下内容:
Table 3
+-----+------------+------+-------+------+-----+------------+------+-------+
| ID1 | Date1 | Var1 | Group | Var2 | ID2 | Date2 | VarZ | Group |
+-----+------------+------+-------+------+-----+------------+------+-------+
| 20 | 2020-11-06 | 2 | A | 6 | 4 | 2022-01-15 | 2 | A |
| 23 | 2021-04-13 | 6 | B | 4 | 5 | 2019-08-02 | 6 | B |
| 22 | 2020-05-10 | 7 | C | 9 | 9 | 2021-05-02 | 7 | C |
| 25 | 2021-09-23 | 4 | C | 1 | 6 | 2021-12-29 | 2 | C |
+-----+------------+------+-------+------+-----+------------+------+-------+
如您所见,只有一个来自 Table 1 的 A 组案例将被合并,因为第二个案例在 Table 1 中具有 A 组,在 Table 中没有任何对应项2.
这实质上是将 Table 1 中的案例与 Table 2 中的案例进行匹配,其中每个案例仅匹配一次,匹配按日期排序,未匹配的案例不会出现在最终 table.
我正在使用 python 和 MySQL。我尝试使用内部联接并按日期变量排序,但无济于事,因为我从一个 table 获取重复案例,如果另一个案例中存在多个案例。非常感谢任何帮助。
您需要 ROW_NUMBER()
window 函数对两个表中每个 Group
的行进行排名,以便您根据该排名加入它们 Group
:
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY `Group` ORDER BY Date1) rn FROM table1) t1
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY `Group` ORDER BY Date2) rn FROM table2) t2
ON t2.`Group` = t1.`Group` AND t2.rn = t1.rn;
参见demo。