匹配两个表,不重复按时间顺序评估

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