数据分析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离职率和司龄的计算的主要内容,如果未能解决你的问题,请参考以下文章

库龄的计算公式是啥

数据分析SQL离职率

求根据入职日期计算工龄的公式,并附带解释。

30日留存率怎么写

python实现计算精度召回率和F1值

使用 scikit learn 计算 pandas Dataframe 中各行之间的准确率、召回率和准确率