Oracle 查询以查找前 2 个条目

Oracle query to find previous 2 entries

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 分析函数与前 2 行的 window 结合使用:

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, code, "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, 'ESL', DATE '2020-10-12' FROM DUAL UNION ALL
  SELECT 567, 'PTO', DATE '2020-10-09' FROM DUAL UNION ALL
  SELECT 567, 'PTO', DATE '2020-10-07' FROM DUAL

输出:

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

db<>fiddle here