hive sql 常用場景二 相鄰時間問題

drop table default.salary;

create table default.salary? (

userid string,

dateid string,

salary? int

);

/*

insert into default.salary values('001','2019-03-01',70);

insert into default.salary values('001','2019-03-02',70);

insert into default.salary values('001','2019-03-03',70);

insert into default.salary values('002','2019-03-01',80);

insert into default.salary values('002','2019-03-02',80);

insert into default.salary values('002','2019-03-03',80);

insert into default.salary values('001','2019-04-01',70);

insert into default.salary values('001','2019-04-02',70);

insert into default.salary values('001','2019-05-03',70);

*/

select * from default.salary;

--寫法一

SELECT userid

? ? ? ,first1

? ? ? ,last1

? ? ? ,datediff(last1, first1)+1 days

? ? ? ,salary * (datediff(last1, first1)+1)? as salary

FROM

? ( SELECT userid

? ? ? ? ? ,num

? ? ? ? ? ,salary

? ? ? ? ? ,min(dateid) as first1

? ? ? ? ? ,max(dateid) as last1

? ? ? FROM

? ? ? ? (? SELECT a.userid

? ? ? ? ? ? ? ? ,a.dateid

? ? ? ? ? ? ? ? ,date_sub(dateid, rn - 1) num

? ? ? ? ? ? ? ? ,salary

? ? ? ? ? ? FROM

? ? ? ? ? ? ? (? SELECT userid

? ? ? ? ? ? ? ? ? ? ,dateid

? ? ? ? ? ? ? ? ? ? ,salary

? ? ? ? ? ? ? ? ? ? ,row_number() over(PARTITION BY userid ORDER BY dateid) rn

? ? ? ? ? ? ? ? ? ? FROM default.salary

? ? ? ? ? ? ? ? ? ? GROUP BY userid,dateid,salary

? ? ? ? ? ? ? ? ) a

? ? ? ? ) b?

? ? ? ? group by userid,num,salary

? ? ) a

--寫法二

SELECT a.userid

? ? ? ,b.starttime

? ? ? ,b.endtime

? ? ? ,datediff(b.endtime,b.starttime) + 1 days

? ? ? ,sum(case when a.dateid>=b.starttime and a.dateid<=b.endtime then a.salary else 0 end) as total_salary

FROM default.salary a

LEFT JOIN

(? SELECT userid

? ? ? ? ? ,days

? ? ? ? ? ,qujian[0]? ? starttime

? ? ? ? ? ,case when days=1 then qujian[0]

? ? ? ? ? ? ? ? when days=2 then qujian[1]

? ? ? ? ? ? ? ? when days=3 then qujian[2]

? ? ? ? ? ? ? ? when days=4 then qujian[3] end as? endtime? ? --此處如有其它時間差,需要進行枚舉

? ? FROM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --取出連續(xù)時間范圍

? ? ? (? SELECT userid

? ? ? ? ? ? ? ,datediff(max(end_date),min(end_date)) + 1 days

? ? ? ? ? ? ? ,COLLECT_set(end_date) qujian

? ? ? ? ? FROM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --求出連續(xù)時間之差

? ? ? ? ? ( SELECT userid

? ? ? ? ? ? ? ? ? ,dateid end_date

? ? ? ? ? ? ? ? ? ,salary

? ? ? ? ? ? ? ? ? ,date_sub(dateid,rn-1) as? start_date

? ? ? ? ? ? ? FROM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --日期與排名之間的差值

? ? ? ? ? ? ? ( SELECT userid

? ? ? ? ? ? ? ? ? ? ? ,dateid

? ? ? ? ? ? ? ? ? ? ? ,salary

? ? ? ? ? ? ? ? ? ? ? ,row_number () over (partition by userid order by dateid) rn

? ? ? ? ? ? ? ? ? FROM default.salary? ? ? ? ? ? ? ? --按name分組后對date進行排序

? ? ? ? ? ? ? ? ) a?

? ? ? ? ? ? ) a

? ? ? ? GROUP BY userid,start_date

? ? ? ) a

? ) b on a.userid=b.userid

GROUP BY a.userid,b.starttime,b.endtime?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容