当前位置: 首页 > article >正文

SQL解惑 - 谜题2

文章目录

  • 一、谜题描述
  • 二、分析
  • 三、答案
  • 四、总结

一、谜题描述

创建一个记录雇员缺勤率的数据库。使用的表结构如下: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_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

SQL2:找出一年内严重性计分累计达到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


http://www.kler.cn/a/158609.html

相关文章:

  • 智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁
  • Acme PHP - Let‘s Encrypt
  • 【gitlab】gitlabrunner部署
  • fpga 同步fifo
  • Django5 2024全栈开发指南(三):数据库模型与ORM操作
  • Linux守护Pythom脚本运行——Supervisor学习总结
  • 深入理解Redis分片策略:提升系统性能的关键一步
  • JavaScript 数组方法 reduce() 的用法
  • 【100天精通Python】Day76:Python机器学习-第一个机器学习小项目_鸾尾花分类项目,预测与可视化完整代码(下)
  • 【云备份】业务处理
  • 前端知识笔记(十二)———前端面试容易问到的问题总结
  • Java操作Excel之 POI介绍和入门
  • 状态空间的定义
  • 【.NET Core】Linq查询运算符(一)
  • gpt阅读论文利器
  • 【开源】基于Vue和SpringBoot的数字化社区网格管理系统
  • qt相关宏
  • 深入理解JVM中的即时编译器(JIT)
  • AIGC发展史
  • 基于Springboot的社区医院管理服务系统(有报告)。Javaee项目,springboot项目。
  • springcloud整合Oauth2自定义登录/登出接口
  • WiFi模块ESP8266(超详细)---(含固件库、AP、STA、原子云使用)
  • Koa开发
  • 【算法集训】基础数据结构:一、顺序表(下)
  • jmeter资料
  • SpringBoot_02