根据下图中的数据,请编写SQL找出申请日期到受理日期间超过10个工作日(包含10个工作日)的ID有哪些?
表1
日期dt | 是否工作日isworkday |
---|---|
2020-06-1 | Y |
2020-06-2 | Y |
2020-06-3 | Y |
2020-06-4 | Y |
2020-06-5 | Y |
2020-06-6 | N |
2020-06-7 | N |
2020-06-8 | Y |
2020-06-9 | Y |
2020-06-10 | Y |
2020-06-11 | Y |
2020-06-12 | Y |
2020-06-13 | N |
2020-06-14 | N |
2020-06-15 | Y |
2020-06-16 | Y |
2020-06-17 | Y |
2020-06-18 | Y |
2020-06-19 | Y |
2020-06-20 | N |
2020-06-21 | N |
2020-06-22 | Y |
2020-06-23 | Y |
2020-06-24 | Y |
2020-06-25 | N |
2020-06-26 | N |
2020-06-27 | N |
2020-06-28 | Y |
2020-06-29 | Y |
2020-06-30 | Y |
表2
id | 申请日期startdate | 受理日期enddate |
---|---|---|
1 | 2020-06-02 | 2020-06-08 |
2 | 2020-06-03 | 2020-06-26 |
3 | 2020-06-05 | 2020-06-15 |
4 | 2020-06-15 | 2020-06-30 |
5 | 2020-06-18 | 2020-06-27 |
建表语句:
create table tab1 (dt string, isworkday string) ;
insert into tab1
values ('2020-06-1', 'Y'),
('2020-06-2', 'Y'),
('2020-06-3', 'Y'),
('2020-06-4', 'Y'),
('2020-06-5', 'Y'),
('2020-06-6', 'N'),
('2020-06-7', 'N'),
('2020-06-8', 'Y'),
('2020-06-9', 'Y'),
('2020-06-10', 'Y'),
('2020-06-11', 'Y'),
('2020-06-12', 'Y'),
('2020-06-13', 'N'),
('2020-06-14', 'N'),
('2020-06-15', 'Y'),
('2020-06-16', 'Y'),
('2020-06-17', 'Y'),
('2020-06-18', 'Y'),
('2020-06-19', 'Y'),
('2020-06-20', 'N'),
('2020-06-21', 'N'),
('2020-06-22', 'Y'),
('2020-06-23', 'Y'),
('2020-06-24', 'Y'),
('2020-06-25', 'N'),
('2020-06-26', 'N'),
('2020-06-27', 'N'),
('2020-06-28', 'Y'),
('2020-06-29', 'Y'),
('2020-06-30', 'Y');
create table tab2 (id int, startdate string, enddate string) ;
insert into tab2 values (1, '2020-06-02', '2020-06-08'),
(2, '2020-06-03', '2020-06-26'),
(3, '2020-06-05', '2020-06-15'),
(4, '2020-06-15', '2020-06-30'),
(5, '2020-06-18', '2020-06-27');
select * from tab1;
select * from tab2;
需求:
编写SQL找出申请日期到受理日期间超过10个工作日(包含10个工作日)的ID有哪些?
分析思路:对于两个时间段列举出来具体的日期用sequence函数
sequence(to_date(startdate), to_date(enddate), interval 1 day
再通过类似于行转列,就是 explode()函数,不是完全的行转列==> explode()函数 接着过滤掉周末再求和
最终SQL语句:
select sequence() from tab2;
with t1 as (
SELECT id,
explode(sequence(to_date(startdate), to_date(enddate), interval 1 day)) day
from tab2
)
select id,
count(day) as days
from t1 join tab1
on t1. day=to_date(tab1.dt)
where isworkday='Y'
group by id
having count(day) >=10
order by id
;