如果满足第一个条件,则执行Oracle中的第二个条件

时间:2020-10-14 12:39:57

标签: sql oracle greatest-n-per-group

我试图按表从状态中获取Employee。我有2个状态,如果员工有 A 个条件,则执行该行,否则采用最大 oper_day P 状态行,如下所示:< / p>

表格

---------------------------------------------------
id  |  emp_code  | name    | status   | oper_day  |
--------------------------------------------------
1   |  164094    | John    | P        | 2020-10-02 |
2   |  164094    | John    | P        | 2020-10-09 |
3   |  164094    | John    | A        | 2020-10-10 |
4   |  145890    | Mike    | P        | 2020-10-05 |

我的结果应如下所示

--------------------------------
id  |  emp_code  | name    | status   | oper_day  |
--------------------------------------------------
1   |  164094    | John    | A        | 2020-10-10 |
2   |  145890    | Mike    | P        | 2020-10-05 |

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

使用ROW_NUMBER

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY emp_code ORDER BY status, oper_day DESC) rn
    FROM yourTable t
)

SELECT id, emp_code, name, status, oper_day  
FROM cte
WHERE rn = 1;

这里的逻辑是,如果一个员工有一个状态A记录,它将被分配第一行号,因为AP之前排序。否则,将选择P状态记录。如果有多个记录,我们将为每个员工选择更新的记录。

答案 1 :(得分:0)

您可以将聚合函数与KEEP( DENSE_RANK FIRST ORDER BY ... )一起使用:

SELECT MAX( id ) KEEP ( DENSE_RANK FIRST ORDER BY status ASC, oper_day DESC ) AS id,
       emp_code,
       MAX( name ),
       MIN( status ) AS status,
       MAX( oper_day ) KEEP ( DENSE_RANK FIRST ORDER BY status ) AS oper_day
FROM   table_name
GROUP BY
       emp_code

其中,为您的示例数据:

CREATE TABLE table_name ( id, emp_code, name, status, oper_day ) AS
SELECT 1, 164094, 'John', 'P', DATE '2020-10-02' FROM DUAL UNION ALL
SELECT 2, 164094, 'John', 'P', DATE '2020-10-09' FROM DUAL UNION ALL
SELECT 3, 164094, 'John', 'A', DATE '2020-10-10' FROM DUAL UNION ALL
SELECT 4, 145890, 'Mike', 'P', DATE '2020-10-05' FROM DUAL;

输出:

ID | EMP_CODE | MAX(NAME) | STATUS | OPER_DAY           
-: | -------: | :-------- | :----- | :------------------
 4 |   145890 | Mike      | P      | 2020-10-05 00:00:00
 3 |   164094 | John      | A      | 2020-10-10 00:00:00

db <>提琴here