问题描述
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