数据分析SQL离职率和司龄的计算
Posted 小基基o_O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析SQL离职率和司龄的计算相关的知识,希望对你有一定的参考价值。
文章目录
1、离职率
- Dimission Rate
- 衡量企业内部人力资源流动状况 的重要指标
该指标反映 企业对员工的吸引和满意情况 - 离职率过高
会导致人力资源成本增加、组织的效率下降… - 离职率不是越低越好
保持一定的员工流动,有利于人才优胜劣汰,保持企业的活力和创新意识
1.1、计算公式
离 职 率 = 离 职 人 数 / ( 离 职 人 数 + 期 末 在 职 人 数 ) 离职率=离职人数/(离职人数+期末在职人数) 离职率=离职人数/(离职人数+期末在职人数)
-
离职率范围: [ 0 , 1 ] [0,1] [0,1]
-
时间维度:月、季度、半年、年
月 离 职 率 = 月 离 职 人 数 / ( 月 离 职 人 数 + 月 底 在 职 人 数 ) 月离职率=月离职人数/(月离职人数+月底在职人数) 月离职率=月离职人数/(月离职人数+月底在职人数)
年 离 职 率 = 年 离 职 人 数 / ( 年 离 职 人 数 + 年 底 在 职 人 数 ) 年离职率=年离职人数/(年离职人数+年底在职人数) 年离职率=年离职人数/(年离职人数+年底在职人数)
1.2、示例SQL(HIVE)
1.2.1、造数据
-- 员工流动表
CREATE VIEW turnover(staff_id,hire_date,departure_date) AS
SELECT 'a1','2019-01-01',NULL UNION ALL
SELECT 'a2','2019-01-01','2020-03-01' UNION ALL
SELECT 'a3','2019-01-01','2021-02-28' UNION ALL
SELECT 'a6','2019-06-01',NULL UNION ALL
SELECT 'a7','2019-06-01','2020-03-02' UNION ALL
SELECT 'a8','2019-07-01',NULL UNION ALL
SELECT 'a9','2019-07-01','2020-03-02' UNION ALL
SELECT 'a10','2019-07-01','2020-03-02' UNION ALL
SELECT 'a11','2019-07-01','2020-03-02' UNION ALL
SELECT 'a12','2019-09-01','2020-03-02' UNION ALL
SELECT 'a13','2020-01-01',NULL UNION ALL
SELECT 'a14','2020-03-01','2020-03-31' UNION ALL
SELECT 'a15','2020-04-11',NULL UNION ALL
SELECT 'a18','2020-04-11','2021-02-28' UNION ALL
SELECT 'a19','2020-04-11',NULL UNION ALL
SELECT 'a20','2020-04-11',NULL UNION ALL
SELECT 'a21','2020-04-11','2021-08-31' UNION ALL
SELECT 'a22','2020-04-11','2021-08-31' UNION ALL
SELECT 'a23','2020-11-01','2021-08-31' UNION ALL
SELECT 'a24','2020-11-01',NULL UNION ALL
SELECT 'a25','2020-11-01',NULL UNION ALL
SELECT 'a26','2021-03-01',NULL UNION ALL
SELECT 'a26','2021-03-01',NULL UNION ALL
SELECT 'a26','2021-03-01',NULL UNION ALL
SELECT 'a31','2021-06-01',NULL UNION ALL
SELECT 'a31','2021-06-01',NULL UNION ALL
SELECT 'a33','2021-08-01',NULL UNION ALL
SELECT 'a34','2021-09-01',NULL UNION ALL
SELECT 'a34','2021-09-01',NULL UNION ALL
SELECT 'a34','2021-09-01',NULL UNION ALL
SELECT 'a34','2021-09-01',NULL UNION ALL
SELECT 'a34','2021-09-01',NULL UNION ALL
SELECT 'a34','2021-09-01','2021-09-30' UNION ALL
SELECT 'a35','2021-10-01',NULL UNION ALL
SELECT 'a36','2021-11-01',NULL;
-- 月维度表
CREATE VIEW t(ym) AS
SELECT '2019-01' UNION ALL SELECT '2019-02' UNION ALL SELECT '2019-03' UNION ALL
SELECT '2019-04' UNION ALL SELECT '2019-05' UNION ALL SELECT '2019-06' UNION ALL
SELECT '2019-07' UNION ALL SELECT '2019-08' UNION ALL SELECT '2019-09' UNION ALL
SELECT '2019-10' UNION ALL SELECT '2019-11' UNION ALL SELECT '2019-12' UNION ALL
SELECT '2020-01' UNION ALL SELECT '2020-02' UNION ALL SELECT '2020-03' UNION ALL
SELECT '2020-04' UNION ALL SELECT '2020-05' UNION ALL SELECT '2020-06' UNION ALL
SELECT '2020-07' UNION ALL SELECT '2020-08' UNION ALL SELECT '2020-09' UNION ALL
SELECT '2020-10' UNION ALL SELECT '2020-11' UNION ALL SELECT '2020-12' UNION ALL
SELECT '2021-01' UNION ALL SELECT '2021-02' UNION ALL SELECT '2021-03' UNION ALL
SELECT '2021-04' UNION ALL SELECT '2021-05' UNION ALL SELECT '2021-06' UNION ALL
SELECT '2021-07' UNION ALL SELECT '2021-08' UNION ALL SELECT '2021-09' UNION ALL
SELECT '2021-10' UNION ALL SELECT '2021-11' UNION ALL SELECT '2021-12';
1.2.2、计算离职率(每月)
WITH
-- 当期入职人数
h AS (
SELECT
SUBSTR(hire_date,0,7) ym,
COUNT(hire_date) c
FROM turnover
GROUP BY SUBSTR(hire_date,0,7)
),
-- 当期离职人数
d AS (
SELECT
SUBSTR(departure_date,0,7) ym,
COUNT(departure_date) c
FROM turnover
GROUP BY SUBSTR(departure_date,0,7)
),
-- 月维度、当期入职人数、当期离职人数
staff_count_ym AS (
SELECT
t.ym ym,
NVL(h.c,0) hire_count,
NVL(d.c,0) departure_count
FROM t
LEFT JOIN h ON t.ym=h.ym
LEFT JOIN d ON t.ym=d.ym
),
-- 添加:累计入职人数、累计离职人数
staff_accumulation_ym AS (
SELECT
ym,
hire_count,
departure_count,
SUM(hire_count) OVER(
ORDER BY ym
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) hire_accumulation,
SUM(departure_count) OVER(
ORDER BY ym
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) departure_accumulation
FROM staff_count_ym
)
-- 添加:当期在职人数、离职率
SELECT
ym,
hire_count,
departure_count,
hire_accumulation,
departure_accumulation,
hire_accumulation-departure_accumulation AS on_job_count,
departure_count/(departure_count+hire_accumulation-departure_accumulation) AS dimission_rate
FROM staff_accumulation_ym;
1.2.3、计算离职率(每年)
WITH
-- 年维度、当期入职人数、当期离职人数
staff_count_y AS (
SELECT
SUBSTR(ym,0,4) y,
SUM(hire_count) hire_count,
SUM(departure_count) departure_count
FROM turnover_ym -- 上文的计算结果(按月的员工流动统计表)
GROUP BY SUBSTR(ym,0,4)
),
-- 添加:累计入职人数、累计离职人数
staff_accumulation_y AS (
SELECT
y,
hire_count,
departure_count,
SUM(hire_count) OVER(
ORDER BY y
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) hire_accumulation,
SUM(departure_count) OVER(
ORDER BY y
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) departure_accumulation
FROM staff_count_y
)
-- 添加:当期在职人数、离职率
SELECT
y,
hire_count,
departure_count,
hire_accumulation,
departure_accumulation,
hire_accumulation-departure_accumulation AS on_job_count,
departure_count/(departure_count+hire_accumulation-departure_accumulation) AS dimission_rate
FROM staff_accumulation_y;
1.2.4、计算离职率(某个月)
WITH
-- 某月在岗人数
on_the_job AS (
SELECT
'2021-08' ym,
COUNT(1) on_the_job_count
FROM turnover
WHERE
-- 从开始到某月,还没离职的
(SUBSTR(departure_date,0,7)>='2021-08' OR departure_date IS NULL)
-- 并且
AND
-- 从开始到某月,入职的
SUBSTR(hire_date,0,7)<='2021-08'
),
-- 某月离职人数
departure AS (
SELECT
'2021-08' ym,
COUNT(1) departure_count
FROM turnover
WHERE SUBSTR(departure_date,0,7)='2021-08'
)
SELECT
o.ym AS ym,
o.on_the_job_count AS on_the_job_count,
d.departure_count AS departure_count,
D.departure_count/o.on_the_job_count AS dimission_rate
FROM on_the_job o
LEFT JOIN departure d ON o.ym=d.ym;
2021-08
结果
1.3、指标细化
维度 | 说明 |
---|---|
招聘 | 渠道社招、校招、内推 |
性别 | 男、女 |
绩效 | 绩优、绩差 |
是否转正 | 试用期、正式 |
学历 | 本科、硕士、博士… |
部门 | IT部、产品部、运营部… |
… |
细化指标 | 备注 |
---|---|
当期在岗人数 | = 期 末 在 职 人 数 + 当 期 离 职 人 数 = 期 初 在 职 人 数 + 当 期 入 职 人 数 + 当 期 离 职 人 数 = 期末在职人数 + 当期离职人数 \\\\ = 期初在职人数 + 当期入职人数 + 当期离职人数 =期末在职人数+当期离职人数=期初在职人数+当期入职人数+当期离职人数 |
男性员工数 | 在岗的 |
男性员工离职数 | |
男性员工离职率 | = 男 性 员 工 离 职 数 / 男 性 员 工 数 =男性员工离职数/男性员工数 =男性员工离职数/男性员工数 |
女性员工数 | 在岗的 |
女性员工离职数 | |
女性员工离职率 | = 女 性 员 工 离 职 数 / 女 性 员 工 数 =女性员工离职数/女性员工数 =女性员工离职数/女性员工数 |
2、司龄
年龄的计算
当
前
年
龄
=
(
今
天
−
生
日
)
÷
365
当前年龄 = (今天 - 生日) \\div 365
当前年龄=(今天−生日)÷365
SELECT DATEDIFF(CURRENT_DATE(),'1995-05-05')/365;
某些年是366天,影响不大,可忽略
司龄
成为公司员工的时间长度
2.1、示例SQL(HIVE)
当前日期:
2021-12-16
2.1.1、当前司龄的计算
在
职
员
工
司
龄
=
(
今
天
−
入
职
日
期
)
÷
365
在职员工司龄 = (今天 - 入职日期) \\div 365
在职员工司龄=(今天−入职日期)÷365
离
职
员
工
司
龄
=
(
离
职
日
期
−
入
职
日
期
)
÷
365
离职员工司龄 = (离职日期 - 入职日期) \\div 365
离职员工司龄=(离职日期−入职日期)÷365
SELECT
staff_id,hire_date,departure_date,
DATEDIFF(NVL(departure_date,CURRENT_DATE()),hire_date)/365 AS year_in_the_company
FROM turnover;
2.1.2、某个时刻的司龄
SET ymd='2020-12-12'; -- 某个时刻
SELECT
staff_id,hire_date,departure_date,
-- 某个时刻是否在职
IF($hiveconf:ymd<NVL(departure_date,'9999-12-31'),'在职',''),
-- 某个时刻的司龄
DATEDIFF(IF($hiveconf:ymd<NVL(departure_date,'9999-12-31'),$hiveconf:ymd,departure_date),hire_date)/365
FROM turnover
WHERE hire_date<$hiveconf:ymd;
注意:有些已离职员工在当时是还没离职,有些已入职员工在当时还没入职
2.2、下游
度量方式 | 维度 |
---|---|
年龄分布 司龄分布 年龄分布占比 司龄分布占比 年龄平均值 司龄平均值 … | 是否离职 性别 绩效 … |
- 以上是关于数据分析SQL离职率和司龄的计算的主要内容,如果未能解决你的问题,请参考以下文章