需求 - 计算最大的连续上班天数,剔除掉周六周日
create table temp.temp_fuyun_attendance_tb (
date_col string,
employee_no string,
is_punch string
)
row format delimited fields terminated by '\t';
实现思路 :
需求 - 计算最大的连续上班天数,剔除掉周六周日
思路:
1.求出每日对应的星期
实现代码
//连续登录的天数,跳过周六周日
// 周四 周五 周一 周二 连续四天上班
// 思路
// 1.根据时间添加日期字段
方法一:自定义算法函数
mod(datediff(date_col, '1970-02-01'), 7) week_which_day --标记周几,周日为0
方法二:使用常用dayofweek函数
dayofweek(date_col);
// 2.根据当前的时间 求出来 rownumber 序号,根据当前员工号分组排序,过滤出来上班的和周六周日的
// 3.
with t1_tb as
(
select date_col, employee_no, week_which_day,
date_sub(date_col, (row_number() over(partition by employee_no order by date_col) - 1)) from_day --连续打卡的开始日期
from
(
select date_col, employee_no, is_punch,
mod(datediff(date_col, '1970-02-01'), 7) week_which_day --标记周几,周日为0
from temp.temp_fuyun_attendance_tb
group by date_col, employee_no, is_punch
) t
--将缺勤的数据过滤,但保留周末的数据(如果过滤周末数据,则每个员工最大连续打卡天数为5)
where is_punch = '上班' or week_which_day in (6, 0)
)
select employee_no, start_date, end_date, continuous_days
from
(
select employee_no, start_date, end_date, continuous_days,
row_number() over(partition by employee_no order by continuous_days desc) rn
from
(
select employee_no,
min(date_col) start_date, --连续打卡的开始日期
max(date_col) end_date, --连续打卡的结束日期
count(1) continuous_days --连续打卡天数
from t1_tb
where week_which_day not in (6, 0)
group by from_day, employee_no
) t
) t1
where rn = 1 --每个员工只取连续打卡最大天数的记录
需求2:计算最大的连续上班天数,剔除掉周五周六
需求3:计算最大的连续上班天数,并且打印出最大的连续上班天数中的起始打卡日期和结束打开日期