开发者社区> 问答> 正文

如何将表A中的日期与表B中的日期范围进行匹配,以及如何从表B中获取相应的数据

表A

**ID      empID       log_date_time**
1        1234        2019-10-06 01:00  
2        1234        2019-10-07 03:00
表B

**empID          start_date_time     end_date_time**
1234           2019-10-06 22:00    2019-10-07 02:00

预期产量

表C

**ID      empID       log_date_time         within_range_flag**
1        1234        2019-10-06 01:00            1
2        1234        2019-10-07 03:00            0

表A中有大约10,000,000条记录,表B中有15,000条记录。我尝试了联接,但是似乎要花很长时间才能处理。

任何想法如何将表A的日期时间与表B的日期时间范围匹配?

谢谢。

---编辑我还需要输入表B的信息以供参考。所以预期的输出是

表C

**ID      empID       log_date_time         within_range_flag         start_date_time     end_date_time**
1        1234        2019-10-06 01:00            1                  2019-10-06 22:00    2019-10-07 02:00
2        1234        2019-10-07 03:00            0

展开
收起
祖安文状元 2020-01-05 14:44:35 588 0
1 条回答
写回答
取消 提交回答
  • 尝试这个:

    select
        ID, empID, log_date_time,
        case when start_date_time is null then 0 else 1 end within_range_flag, start_date_time
    from (
      select a.ID, a.empID, log_date_time, min(start_date_time) start_date_time
      from tableA a
      left join tableB b on b.empID = a.empID
        and a.log_date_time between b.start_date_time and b.end_date_time
      group by a.ID, a.empID, log_date_time
    ) x
    
    

    这是通过使用聚集将所有连接的tableB行折叠为一个值来最早获得的start_date_time。如果没有任何跳转行,start_date_time则null可以使用该事实来产生标志值。

    假设您要使用start_date_timetableB中所有匹配行中最早的一个。如果需要最新版本,请使用max()。如果您想要不同的东西,请不要使用此查询。

    您应该在创建索引tableB(empId, start_date_time, end_date_time)。

    2020-01-05 14:44:46
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载