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
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