使用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的级别变化之间所需的时间