在有效日期表中使用Oracle SQL获取先验值

t2a7ltrp  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(93)

如何在有条件的有效日期表中获取先验值?
例如,我想获取从佛罗里达(FL)州迁出的所有员工
以下是表格数据:
| 员工id|埃夫特|状态|
| --|--|--|
| 1 |2022年1月1日|FL|
| 1 |2022年1月5日|FL|
| 1 |2023年1月1日|哦|
| 2 |2021年1月1日|NY|
| 2 |2022年1月1日|CA|
| 3 |2019年1月1日|FL|
| 3 |2023年1月1日|TX|
预期结果:
| 员工id|埃夫特|状态|
| --|--|--|
| 1 |2022年1月5日|FL|
| 1 |2023年1月1日|哦|
| 3 |2019年1月1日|FL|
| 3 |2023年1月1日|TX|
我不知道从何说起?

select * 
from ps_addresses 
where effdt = (
  select max(effdt)
    from (
    select 
      emplid, effdt, STATE, over(order by effdt desc) as prev
      from ps_addresses
    ) x  
    where prev is not null and STATE <> prev
);
wgx48brx

wgx48brx1#

我想让所有从佛罗里达州搬走的员工
如果要获取员工从佛罗里达开始工作,然后在下一行中移动到佛罗里达的这对行,则可以在Oracle 12中使用MATCH_RECOGNIZE

SELECT * 
FROM   ps_addresses 
MATCH_RECOGNIZE(
  PARTITION BY emplid
  ORDER     BY effdt
  ALL ROWS PER MATCH
  PATTERN (fl not_fl)
  DEFINE
    fl     AS state = 'FL',
    not_fl AS state != 'FL'
);

或者,您可以使用LAGLEAD分析函数:

SELECT emplid,
       effdt,
       state
FROM   (
  SELECT p.*,
         LAG(state) OVER (PARTITION BY emplid ORDER BY effdt) AS prev_state,
         LEAD(state) OVER (PARTITION BY emplid ORDER BY effdt) AS next_state
  FROM   ps_addresses p
)
WHERE  ( state = 'FL' AND next_state != 'FL' )
OR     ( state != 'FL' AND prev_state = 'FL' );

其中,对于样本数据:

CREATE TABLE ps_addresses (Emplid, Effdt, State) AS
SELECT 1, DATE '2022-01-01', 'FL' FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-05', 'FL' FROM DUAL UNION ALL
SELECT 1, DATE '2023-01-01', 'OH' FROM DUAL UNION ALL
SELECT 2, DATE '2021-01-01', 'NY' FROM DUAL UNION ALL
SELECT 2, DATE '2022-01-01', 'CA' FROM DUAL UNION ALL
SELECT 3, DATE '2019-01-01', 'FL' FROM DUAL UNION ALL
SELECT 3, DATE '2023-01-01', 'TX' FROM DUAL;

两个输出:
| 员工id|公司简介|状态|
| --|--|--|
| 1 |2019 -01- 15 00:00:00| FL|
| 1 |2019 -01- 21 00:00:00|哦|
| 3 |2019-01-01 00:00:00| FL|
| 3 |2019 -01- 21 00:00:00| TX|
fiddle

相关问题