网站推广营销活动,晋城网络公司做网站的,郑州市的实惠推广网站,目录搜索引擎网站文章目录 一、谜题描述二、分析三、答案四、总结 一、谜题描述
创建一个记录雇员缺勤率的数据库。使用的表结构如下#xff1a;Absenteeism 主键#xff1a;PRIMARY KEY (emp_id, absent_date)
字段名字段类型字段中文名字段描述emp_idINTERGER雇员id-absent_dateSTRING缺勤… 文章目录 一、谜题描述二、分析三、答案四、总结 一、谜题描述
创建一个记录雇员缺勤率的数据库。使用的表结构如下Absenteeism 主键PRIMARY KEY (emp_id, absent_date)
字段名字段类型字段中文名字段描述emp_idINTERGER雇员id-absent_dateSTRING缺勤日期-reason_codeSTRING缺勤原因-severity_pointsINTEGER严重性计分对缺勤行为进行处罚性计分
如果雇员在一年的时间内严重性计分累计达到40就自动将该雇员解雇。如果雇员连续缺勤超过一天就视为长病假而不是普通的缺勤。这时第二天、第三天和以后的日子中都不会统计该股元的严重性分数这些天也不算做缺勤。
二、分析
步骤1将雇员连续缺勤记录的严重性计分置为0 步骤2找出一年内严重性计分累计达到40的雇员 需要用到的关联表 雇员表Personnel
字段名字段类型字段中文名字段描述emp_idINTERGER雇员id雇员唯一标识emp_nameSTRING雇员名字-
日期维度表Calendar
字段名字段类型字段中文名字段描述dateSTRING日期唯一键date_typeSTRING日期类型eg工作日/周末
三、答案 SparkSQL语法 SQL1将雇员连续缺勤达到一天的记录的严重性计分置为0 思路按雇员分组按日期排序得到rn用日期减rn用开窗的方式代替group by 减少表自身关联次数。 select emp_id,absent_date,reason_code,if(absent_cnt 1,0,severity_points) as severity_points
from
(select emp_id,absent_date,reason_code,severity_points,tag_date,sum(1)over(partition by emp_id,date_add(absent_date,-rn)) as absent_cntfrom (select emp_id,absent_date,reason_code,severity_points,row_number()over(partition by emp_id order by absent_date) as rnfrom Absenteeism) in1
) t1SQL2找出一年内严重性计分累计达到40的雇员
select t1.emp_id,sum(t1.severity_points)
from t1
left join Calendar t2
where t2.date_type work
and t1.absent_date between date_add(CURRENT_DATE,-365) and CURRENT_DATE
group by t1.emp_id
having sum(t1.severity_points) 40四、总结 处理连续问题 标准步骤 1按雇员分组按日期排序得到rn 2用日期减rn