Spark SQL中如何关联重叠日期表并排除端点重合记录
问题:筛选Table B中与Table A存在实际日期重叠的行
注:仅端点日期重合的情况不算重叠
表结构与数据
Table A
| id | start_date | end_date |
|---|---|---|
| 1 | 2020-01-06 | 2020-01-07 |
| 1 | 2020-01-07 | 2020-01-08 |
| 1 | 2020-01-08 | 2020-01-09 |
| 1 | 2020-01-09 | 2020-01-10 |
| 1 | 2020-01-10 | 2020-01-11 |
Table B
| id | start_date | end_date |
|---|---|---|
| 2 | 2020-01-01 | 2020-01-02 |
| 2 | 2020-01-02 | 2020-01-03 |
| 2 | 2020-01-03 | 2020-01-04 |
| 2 | 2020-01-04 | 2020-01-05 |
| 2 | 2020-01-05 | 2020-01-06 |
| 2 | 2020-01-06 | 2020-01-07 |
需求
筛选Table B中与Table A存在实际日期重叠的行(仅端点重合不算),期望结果如下:
| id | start_date | end_date |
|---|---|---|
| 2 | 2020-01-06 | 2020-01-07 |
当前SQL的问题
原SQL使用包含端点的重叠判断逻辑,导致把仅端点重合的行也筛选出来:
SELECT DISTINCT b.* FROM tableB b INNER JOIN tableA a ON ((b.start_date <= a.end_date) AND (b.end_date >= a.start_date))
返回结果包含了不需要的记录:
| id | start_date | end_date |
|---|---|---|
| 2 | 2020-01-05 | 2020-01-06 |
| 2 | 2020-01-06 | 2020-01-07 |
正确的Spark SQL解决方案
修改连接条件,将包含端点的判断改为严格小于/大于,排除仅端点重合的情况:
SELECT DISTINCT b.* FROM tableB b INNER JOIN tableA a ON (b.start_date < a.end_date AND b.end_date > a.start_date)
验证结果
执行上述SQL后,将得到预期结果:
| id | start_date | end_date |
|---|---|---|
| 2 | 2020-01-06 | 2020-01-07 |
内容的提问来源于stack exchange,提问作者nathaneastwood
相关产品推荐
相关产品推荐

