如何在 SQL 中以 ID 和 DATE RANGE 连接两个表
How can I join two tables on an ID and a DATE RANGE in SQL
我有 2 个查询结果 tables 包含不同评估的记录。有 RAssessments 和 NAssessments 组成一个完整的评论。
目的是最终确定完成了哪些审核。我想在 ID 和日期上加入两个 tables,但是每个评估完成的日期可能不相同,可能相隔几天,有些 ID 可能有更多的 RAssessment比 NAssessment.
因此,我想在 ID 和 T1Date(+ 或 - 7 天)加入 T1 到 T2。除了使用日期范围外,没有其他方法可以匹配两个 table 并对齐记录,因为这是一个设计不佳的数据库。我很困惑,希望得到一些帮助。
这是一些示例数据:
Table #1:
ID
RAssessmentDate
1
2020-01-03
1
2020-03-03
1
2020-05-03
2
2020-01-09
2
2020-04-09
3
2022-07-21
4
2020-06-30
4
2020-12-30
4
2021-06-30
4
2021-12-30
Table #2:
ID
NAssessmentDate
1
2020-01-07
1
2020-03-02
1
2020-05-03
2
2020-01-09
2
2020-07-06
2
2020-04-10
3
2022-07-21
4
2021-01-03
4
2021-06-28
4
2022-01-02
4
2022-06-26
我希望我的最终结果 table 看起来像这样:
ID
RAssessmentDate
NAssessmentDate
1
2020-01-03
2020-01-07
1
2020-03-03
2020-03-02
1
2020-05-03
2020-05-03
2
2020-01-09
2020-01-09
2
2020-04-09
2020-04-10
2
NULL
2020-07-06
3
2022-07-21
2022-07-21
4
2020-06-30
NULL
4
2020-12-30
2021-01-03
4
2021-06-30
2021-06-28
4
2021-12-30
2022-01-02
4
NULL
2022-01-02
试试这个:
SELECT
COALESCE(a.ID, b.ID) ID,
a.RAssessmentDate,
b.NAssessmentDate
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RowId, *
FROM table1
) a
FULL OUTER JOIN (
SELECT
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RowId, *
FROM table2
) b ON a.ID = b.ID AND a.RowId = b.RowId
WHERE (a.RAssessmentDate BETWEEN '2020-01-01' AND '2022-01-02')
OR (b.NAssessmentDate BETWEEN '2020-01-01' AND '2022-01-02')
我有 2 个查询结果 tables 包含不同评估的记录。有 RAssessments 和 NAssessments 组成一个完整的评论。
目的是最终确定完成了哪些审核。我想在 ID 和日期上加入两个 tables,但是每个评估完成的日期可能不相同,可能相隔几天,有些 ID 可能有更多的 RAssessment比 NAssessment.
因此,我想在 ID 和 T1Date(+ 或 - 7 天)加入 T1 到 T2。除了使用日期范围外,没有其他方法可以匹配两个 table 并对齐记录,因为这是一个设计不佳的数据库。我很困惑,希望得到一些帮助。
这是一些示例数据:
Table #1:
ID | RAssessmentDate |
---|---|
1 | 2020-01-03 |
1 | 2020-03-03 |
1 | 2020-05-03 |
2 | 2020-01-09 |
2 | 2020-04-09 |
3 | 2022-07-21 |
4 | 2020-06-30 |
4 | 2020-12-30 |
4 | 2021-06-30 |
4 | 2021-12-30 |
Table #2:
ID | NAssessmentDate |
---|---|
1 | 2020-01-07 |
1 | 2020-03-02 |
1 | 2020-05-03 |
2 | 2020-01-09 |
2 | 2020-07-06 |
2 | 2020-04-10 |
3 | 2022-07-21 |
4 | 2021-01-03 |
4 | 2021-06-28 |
4 | 2022-01-02 |
4 | 2022-06-26 |
我希望我的最终结果 table 看起来像这样:
ID | RAssessmentDate | NAssessmentDate |
---|---|---|
1 | 2020-01-03 | 2020-01-07 |
1 | 2020-03-03 | 2020-03-02 |
1 | 2020-05-03 | 2020-05-03 |
2 | 2020-01-09 | 2020-01-09 |
2 | 2020-04-09 | 2020-04-10 |
2 | NULL | 2020-07-06 |
3 | 2022-07-21 | 2022-07-21 |
4 | 2020-06-30 | NULL |
4 | 2020-12-30 | 2021-01-03 |
4 | 2021-06-30 | 2021-06-28 |
4 | 2021-12-30 | 2022-01-02 |
4 | NULL | 2022-01-02 |
试试这个:
SELECT
COALESCE(a.ID, b.ID) ID,
a.RAssessmentDate,
b.NAssessmentDate
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RowId, *
FROM table1
) a
FULL OUTER JOIN (
SELECT
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) RowId, *
FROM table2
) b ON a.ID = b.ID AND a.RowId = b.RowId
WHERE (a.RAssessmentDate BETWEEN '2020-01-01' AND '2022-01-02')
OR (b.NAssessmentDate BETWEEN '2020-01-01' AND '2022-01-02')