表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
尝试这个:
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)。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。