0
点赞
收藏
分享

微信扫一扫

时间序列题型+explode(爆炸函数的使用)

我是芄兰 2022-02-06 阅读 45
sqlhivespark

根据下图中的数据,请编写SQL找出申请日期到受理日期间超过10个工作日(包含10个工作日)的ID有哪些?

表1

日期dt是否工作日isworkday
2020-06-1Y
2020-06-2Y
2020-06-3Y
2020-06-4Y
2020-06-5Y
2020-06-6N
2020-06-7N
2020-06-8Y
2020-06-9Y
2020-06-10Y
2020-06-11Y
2020-06-12Y
2020-06-13N
2020-06-14N
2020-06-15Y
2020-06-16Y
2020-06-17Y
2020-06-18Y
2020-06-19Y
2020-06-20N
2020-06-21N
2020-06-22Y
2020-06-23Y
2020-06-24Y
2020-06-25N
2020-06-26N
2020-06-27N
2020-06-28Y
2020-06-29Y
2020-06-30Y

表2

id申请日期startdate受理日期enddate
12020-06-022020-06-08
22020-06-032020-06-26
32020-06-052020-06-15
42020-06-152020-06-30
52020-06-182020-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
;

举报

相关推荐

0 条评论