使用SQL查找员工级别更改的时间
我试图找到一种方法来确定员工需要多长时间才能升级使用SQL查找员工级别更改的时间,sql,Sql,我试图找到一种方法来确定员工需要多长时间才能升级 WITH LEVEL_DATES AS ( SELECT EMPLOYEE_ID, EMPLOYEE_LEVEL, MIN(AS_OF_DATE) AS MIN_LEVEL_DATE FROM EMPLOYEE_DAILY ) SELECT H.EMPLOYEE_ID, H.PROCESS_TYPE, H.CURRENT_LEVEL, H.PROMOTION_LEVEL H.EFFE
WITH LEVEL_DATES AS
(
SELECT
EMPLOYEE_ID,
EMPLOYEE_LEVEL,
MIN(AS_OF_DATE) AS MIN_LEVEL_DATE
FROM EMPLOYEE_DAILY
)
SELECT
H.EMPLOYEE_ID,
H.PROCESS_TYPE,
H.CURRENT_LEVEL,
H.PROMOTION_LEVEL
H.EFFECTIVE_DATE,
LD.MIN_LEVEL_DATE
FROM EMP_HIST H
LEFT JOIN LEVEL_DATES LD
ON H.EMPLOYEE_ID = LD.EMPLOYEE_ID
AND H.PROMOTION_LEVEL != LD.EMPLOYEE_LEVEL
我有两张桌子:
EMPLOYEE_DAILY:包含员工数据的每日快照
EMP_历史记录:包含促销活动、当前促销前级别、促销级别和促销日期
我最初的解决方案是查看EMP_历史表中的晋升事件,然后在employee_DAILY表中获取员工处于晋升前级别的第一个日期,然后从晋升日期中减去该日期以确定员工晋升所需的时间
WITH LEVEL_DATES AS
(
SELECT
EMPLOYEE_ID,
EMPLOYEE_LEVEL,
MIN(AS_OF_DATE) AS MIN_LEVEL_DATE
FROM EMPLOYEE_DAILY
)
SELECT
H.EMPLOYEE_ID,
H.PROCESS_TYPE,
H.CURRENT_LEVEL,
H.PROMOTION_LEVEL
H.EFFECTIVE_DATE,
LD.MIN_LEVEL_DATE
FROM EMP_HIST H
LEFT JOIN LEVEL_DATES LD
ON H.EMPLOYEE_ID = LD.EMPLOYEE_ID
AND H.PROMOTION_LEVEL != LD.EMPLOYEE_LEVEL
我的方法有一个问题,因为员工经常离开公司,有时会多次返回,因此我的查询将提取员工在当前职等的第一个日期(如果是上一个雇佣周期的话),从而延长时间,以达到更高的职等
WITH LEVEL_DATES AS
(
SELECT
EMPLOYEE_ID,
EMPLOYEE_LEVEL,
MIN(AS_OF_DATE) AS MIN_LEVEL_DATE
FROM EMPLOYEE_DAILY
)
SELECT
H.EMPLOYEE_ID,
H.PROCESS_TYPE,
H.CURRENT_LEVEL,
H.PROMOTION_LEVEL
H.EFFECTIVE_DATE,
LD.MIN_LEVEL_DATE
FROM EMP_HIST H
LEFT JOIN LEVEL_DATES LD
ON H.EMPLOYEE_ID = LD.EMPLOYEE_ID
AND H.PROMOTION_LEVEL != LD.EMPLOYEE_LEVEL
是否有人对我如何提取准确的时间到水平变化数据有想法;晋升前级别的第一个日期在员工的雇佣间隔内。我正在使用Oracle数据库
示例场景:
员工1234于2015年1月1日受雇于L1
于2015年3月5日晋升为L2
于2015年4月1日离开公司
2017年1月1日在L1重新聘用
2017年3月1日晋升为L2
示例数据:
EMPLOYEE_DAILY:
EMPLOYEE_ID EMPLOYEE_LEVEL AS_OF_DATE
1234 L1 2015-03-02
1234 L1 2015-03-03
1234 L1 2015-03-04
1234 L2 2015-03-05
EMPLOYEE_HIST:
EMPLOYEE_ID EFFECTIVE_DATE CURRENT_LEVEL PROMOTION_LEVEL
PROCESS_TYPE
1234 2015-03-05 L1 L2
PROMOTION
示例数据:
EMPLOYEE_DAILY:
EMPLOYEE_ID EMPLOYEE_LEVEL AS_OF_DATE
1234 L1 2015-03-02
1234 L1 2015-03-03
1234 L1 2015-03-04
1234 L2 2015-03-05
EMPLOYEE_HIST:
EMPLOYEE_ID EFFECTIVE_DATE CURRENT_LEVEL PROMOTION_LEVEL
PROCESS_TYPE
1234 2015-03-05 L1 L2
PROMOTION
我相信我的查询会查看2017年3月1日的促销活动,并提取2015年1月1日的日期,但我真正想要的是一个查询,它将显示各个促销级别之间的时间,因此2015年3月5日-2015年1月1日和2017年3月1日-2017年1月1日。我运行此查询不是为了验证准确性或正确的语法,但您可以尝试:
select
employee_id
,earliest_as_of_date as effective_date
,prev_employee_level as current_level
,employee_level promotion_level
from (
select
employee_id
,employee_level
,case when lag(employee_id,1) over (order by employee_id, as_of_date) <> employee_id then null -- first row for an employee, can't be a promotion
when lag(employee_level,1) over (order by employee_id, as_of_date) = employee_level then null -- same level as previous row for this employee, is not a promotion
else lag(employee_level,1) over (order by employee_id, as_of_date) as prev_employee_level
,min(as_of_date) over (partition by employee_id,employee_level) as earliest_as_of_date
from
employee_daily
group by 1,2
) a
where 1=1
and prev_employee_level is not null
员工升级需要多长时间。这是什么意思?样本数据和期望的结果将阐明您想要做什么。同时标记您正在使用的数据库。谢谢Gordon。我试图添加您推荐的项目。在我的示例中,我在寻找从L1到L2的级别变化之间所需的时间