一、谜题描述
创建一个记录雇员缺勤率的数据库。使用的表结构如下:Absenteeism
主键:PRIMARY KEY (emp_id, absent_date)
字段名 | 字段类型 | 字段中文名 | 字段描述 |
---|---|---|---|
emp_id | INTERGER | 雇员id | – |
absent_date | STRING | 缺勤日期 | – |
reason_code | STRING | 缺勤原因 | – |
severity_points | INTEGER | 严重性计分 | 对缺勤行为进行处罚性计分 |
如果雇员在一年的时间内严重性计分累计达到40,就自动将该雇员解雇。如果雇员连续缺勤超过一天,就视为长病假,而不是普通的缺勤。这时第二天、第三天和以后的日子中都不会统计该股元的严重性分数,这些天也不算做缺勤。
二、分析
步骤1:将雇员连续缺勤记录的严重性计分置为0;
步骤2:找出一年内严重性计分累计达到40的雇员;
需要用到的关联表:
雇员表:Personnel
字段名 | 字段类型 | 字段中文名 | 字段描述 |
---|---|---|---|
emp_id | INTERGER | 雇员id | 雇员唯一标识 |
emp_name | STRING | 雇员名字 | – |
字段名 | 字段类型 | 字段中文名 | 字段描述 |
---|---|---|---|
date | STRING | 日期 | 唯一键 |
date_type | STRING | 日期类型 | eg:工作日/周末 |
三、答案
SQL1:将雇员连续缺勤达到一天的记录的严重性计分置为0;
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_cnt
from
(
select
emp_id,
absent_date,
reason_code,
severity_points,
row_number()over(partition by emp_id order by absent_date) as rn
from Absenteeism
) in1
) t1
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
原文地址:https://blog.csdn.net/m0_46218511/article/details/134747709
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_45530.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。