简体   繁体   English

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

[英]If first condition satisfies perform it, otherwise second condition in Oracle

I am trying to take Employee by status from table.我正在尝试从表中按状态获取员工。 I have 2 statuses, If an employee has A condition take that row, otherwise take P status row with maximum oper_day It looks like below:我有 2 个状态,如果员工有A条件,则取该行,否则取P状态行,最大oper_day如下所示:

Table桌子

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

My result should look like below我的结果应该如下所示

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

Any help is appreciated任何帮助表示赞赏

Using ROW_NUMBER :使用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;

The logic here is that should an employee have a status A record, it would be assigned the first row number, since A sorts before P .这里的逻辑是,如果员工有状态A记录,它将被分配第一个行号,因为AP之前排序。 Otherwise, a P status record would be chosen.否则,将选择P状态记录。 We choose the more recent record per employee in case of multiple records.如果有多个记录,我们会为每个员工选择最近的记录。

You can use aggregation functions with KEEP( DENSE_RANK FIRST ORDER BY ... ) :您可以将聚合函数与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

Which., for your sample data:其中,对于您的示例数据:

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;

Outputs:输出:

\nID |身份证 | EMP_CODE | EMP_CODE | MAX(NAME) | MAX(姓名) | STATUS |状态 | OPER_DAY OPER_DAY           \n-: | -: | -------: | -------: | :-------- | :-------- | :----- | :----- | :------------------ :------------------\n 4 | 4 | 145890 | 145890 | Mike |迈克 | P | P | 2020-10-05 00:00:00 2020-10-05 00:00:00\n 3 | 3 | 164094 | 164094 | John |约翰 | A |一个 | 2020-10-10 00:00:00 2020-10-10 00:00:00\n

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM