首页 > 解决方案 > 如何获得工作的最新部门的开始日期

问题描述

我正在尝试获取带有开始日期的emp当前工作部门的记录

数据,在下面的数据 Grp 列中,我得到了第三条记录,这是正确的结果。

loginName   emp_name    dept_id     dept_name                   startDate   endDate     Grp
KK          KKLeo       5652        POLO Business – Tech        18-09-17    19-09-17    1
KK          KKLeo       5652        POLO Business – Tech        19-09-17    28-09-17    1
KK          KKLeo       5652        POLO Business – Tech        28-09-17    09-11-17    1
KK          KKLeo       5647        POLO Business               09-11-17    15-03-19    2
KK          KKLeo       5647        POLO Business               15-03-19    16-04-19    2
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   16-04-19    03-05-19    3
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   03-05-19    11-10-19    3
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   11-10-19    22-07-20    3
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   22-07-20    26-08-20    3
KK          KKLeo       5652        POLO Business – Tech        26-08-20    17-02-21    4
KK          KKLeo       5652        POLO Business – Tech        17-02-21    19-02-21    4
KK          KKLeo       5652        POLO Business – Tech        19-02-21    null        4

到目前为止尝试的查询

select login_name,
       emp_name,
       dept_id,
       dept_name,
       startDate,
       endDate, 
       sum (counter) OVER (PARTITION BY emp_name order by startDate) grp
                            from (
                                    select login_name,
                                           emp_name,
                                           dept_id,
                                           dept_name,
                                           startDate,
                                           endDate,
                                           CASE WHEN DEPT_NAME = LAG(DEPT_NAME) OVER (PARTITION BY login_name, emp_name, dept_id ORDER BY startDate)
                                                THEN 0
                                                ELSE 1
                                           END counter
                                    FROM empdepthist 
                               )

我无法提前思考,我Grp现在如何使用来获得倒数第三条记录作为输出。数据只有一个emp细节,但可能有很多。

预期产出

KK          KKLeo       5652        POLO Business – Tech        26-08-20    17-02-21

更新

oginName   emp_name    dept_id     dept_name                   startDate   endDate     PartitionByEMpName   GroupInPartiton    
KK          KKLeo       5652        POLO Business – Tech        18-09-17    19-09-17    1                   a
KK          KKLeo       5652        POLO Business – Tech        19-09-17    28-09-17    1                   a
KK          KKLeo       5652        POLO Business – Tech        28-09-17    09-11-17    1                   a
KK          KKLeo       5647        POLO Business               09-11-17    15-03-19    1                   b
KK          KKLeo       5647        POLO Business               15-03-19    16-04-19    1                   b
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   16-04-19    03-05-19    1                   c
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   03-05-19    11-10-19    1                   c
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   11-10-19    22-07-20    1                   c
KK          KKLeo       5649        POLO Buss-Fixed Sales Mkt   22-07-20    26-08-20    1                   c   
KK          KKLeo       5652        POLO Business – Tech        26-08-20    17-02-21    1                   d   
KK          KKLeo       5652        POLO Business – Tech        17-02-21    19-02-21    1                   d
KK          KKLeo       5652        POLO Business – Tech        19-02-21    null        1                   d

以这种方式可视化是否正确?PartitionByEMpNamecoulmn 值是从 Partition by派生出来的,loginName并且一旦它采用这种格式,Pattern 和measures 就会对这个数据起作用。是正确的 ?GroupInPartitonDEFINE same_dept AS FIRST(dept_id) = dept_id

标签: sqloracle

解决方案


从 Oracle 12 开始,您可以使用MATCH_RECOGNIZE.

SELECT *
FROM   empdepthist
MATCH_RECOGNIZE (
  PARTITION BY loginname
  ORDER BY startdate
  MEASURES
    FIRST(emp_name) AS emp_name,
    FIRST(dept_id) AS dept_id,
    FIRST(dept_name) AS dept_name,
    FIRST(startDate) AS startdate,
    FIRST(endDate) AS enddate
  ONE ROW PER MATCH
  PATTERN (same_dept+ $)
  DEFINE same_dept AS FIRST(dept_id) = dept_id
)

它的工作原理是:

  1. PARTITIONBY loginname
  2. 在每个分区中,ORDERBY startdate.
  3. DEFINEsame_dept模式作为连续行(在给定顺序的分区内),其中匹配FIRST(dept_id)中的 等于匹配dept_id中其他行的 。
  4. PATTERN要匹配的位于排序的末尾 ( ) $,它与定义为匹配模式的一个或多个行 ( +) 的same_dept模式匹配。
  5. 匹配模式后,仅返回ONE ROW PER MATCH.
  6. 该行将包含子句中的列和PARTITION BY子句中定义的值MEASURES,在这种情况下,是FIRST匹配行中的值。

其中,对于样本数据,输出:

登录名 EMP_NAME DEPT_ID DEPT_NAME 开始日期 结束日期
KK KKLeo 5652 POLO 业务 – 技术 26-08-20 17-02-21

db<>在这里摆弄


推荐阅读