如何使用 SQL 分析员工数据
介绍
说到如何分析员工数据,很少有更复杂的数据结构可供使用。处理员工数据集可能带来的最大挑战在于它开始时似乎并不那么简单。让我们从人力资源信息系统 (HRIS) 中获取一个典型的员工表,看看如何对其运行一些常见的分析查询。
以下是我们数据存储的表结构。这是许多 HRIS 系统的典型结构。
我们的餐桌
表名:emps
员工编号 | 聘用日期 | 重新聘用日期 | 任期日期 | 经理编号 | 姓名 |
---|---|---|---|---|---|
1 | 2004-06-17 | 1900-01-01 | 3000-01-01 | -1 | 华盛顿 |
2 | 2004-07-01 | 1900-01-01 | 3000-01-01 | 1 | 亚当斯 |
3 | 2008-05-01 | 1900-01-01 | 2008-07-01 | 2 | 罗斯福 |
4 | 2007-01-01 | 2009-01-01 | 2008-01-01 | 3 | 卡特 |
查询
某一天 (例如 2005-07-01) 有多少人活跃?
如果我们独立回答这些问题,则以下 SQL 就足够了:
select count(1)
from emps
where HireDate <= '2005-07-01'
and TermDate > '2005-07-01'
对每个日期重复此操作。但是那些被重新雇用的员工怎么办?
首先,基于这些数据,我们必须假设当一个人被重新雇用时,他们的TermDate保持不变,并且不会像他们在职时那样重置为3000-01-01。
select count(1)
from emps
where (HireDate >= '2005-07-01'
and TermDate < '2005-07-01')
or (RehireDate >= '2005-07-01'
and (
TermDate < '2005-07-01'
or
TermDate <= RehireDate
)
情节愈发复杂
这一切都很容易,但如果我们想要创建一个视图,显示每天活跃员工总数,以便我们可以随时间推移分析其趋势,并提出更复杂的问题,如同比增长率,该怎么办?
我们需要添加另一个只包含日期的表。在数据仓库中,我们通常将其创建为日期维度。以下是我们使用的基本结构。
表名:日期
日期 | 天 | 月 | 年 |
---|---|---|---|
2005-01-01 | 1 | 5 | 2005 |
2005-01-02 | 2 | 5 | 2005 |
ETC... |
我们将以此为起点,因为它不会受到 emp 表中当时或日期的员工状态的限制。从那里,我们将对我们的 emp 表进行左连接以获取活跃员工的数量,类似于我们上面手动执行的方式。以下是执行此操作的 SQL:
select
DayDate, count(hires.EmployeeId) as ActiveCount
from
dates d
-- get hires
left join
(select 'active' as Status, * from emps) hires
on
( d.Date >= hires.HireDate and d.Date < hires.TermDate) -- normal active
or
(d.Date
between (case when hires.RehireDate = '1900-01-01' then null else hires.RehireDate end)
and hires.TermDate)
where
d.Date between '2004-06-17' and now() -- use the function to pull the current date here
唉,我们有趋势数据!
上述查询的结果将为我们提供每日活跃员工数量,以便我们了解随时间变化的趋势。当然,这只是分析员工数据的第一步,但却是一个坚实的基础,也是数据仓库中日期维度的重要性的一个很好的例子。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~