Oracle查询以查找前2个条目

问题描述

EMP     Code      Date
123     'ESL'     '10-12-2020'
123     'ASU'     '10-09-2020'
123     'PTO'     '10-07-2020'


EMP     Code      Date
567     'ESL'     '10-12-2020'
567     'PTO'     '10-09-2020'
567     'PTO'     '10-07-2020'

从上面的数据示例中,我需要一个查询,该查询提取所有前2个条目都不是PTO的所有ESL记录,因此在我的2个示例中,仅第一个示例应被“标记”,并由查询返回。我尝试了以下无济于事

select * from timedetail t where t.empnum = '000270172' and t.ppenddate = '22-aug-2020' and t.doecode = 'ESL'
and not exists(select 'x' from timedetail t2 where t2.empnum = '000270172' = t.empnum and t2.tsdate < t.tsdate and t2.doecode = PTO')

解决方法

COUNT分析函数与前面两行的窗口一起使用:

SELECT emp,code,"DATE"
FROM (
  SELECT t.*,COUNT( CASE code WHEN 'PTO' THEN 1 END ) OVER (
             PARTITION BY emp ORDER BY "DATE"
             ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
           ) num_pto
  FROM   timedetail t
)
WHERE code = 'ESL'
AND   num_pto < 2;

其中的示例数据:

CREATE TABLE timedetail ( emp,"DATE" ) AS
  SELECT 123,'ESL',DATE '2020-10-12' FROM DUAL UNION ALL
  SELECT 123,'ASU',DATE '2020-10-09' FROM DUAL UNION ALL
  SELECT 123,'PTO',DATE '2020-10-07' FROM DUAL UNION ALL
  SELECT 567,DATE '2020-10-12' FROM DUAL UNION ALL
  SELECT 567,DATE '2020-10-09' FROM DUAL UNION ALL
  SELECT 567,DATE '2020-10-07' FROM DUAL

输出:

EMP | CODE | DATE     
--: | :--- | :--------
123 | ESL  | 12-OCT-20

db 提琴here