【问题标题】:If first condition satisfies perform it, otherwise second condition in Oracle如果满足第一个条件,则执行它,否则 Oracle 中的第二个条件
【发布时间】:2021-01-28 20:50:59
【问题描述】:

我正在尝试按状态从表中获取 Employee。我有 2 个状态,如果员工有 A 条件取该行,否则取 P 状态行,最大 oper_day 如下所示:

表格

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

感谢任何帮助

【问题讨论】:

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


    【解决方案1】:

    使用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 记录,它将被分配第一行编号,因为A 排在P 之前。否则,将选择P 状态记录。如果有多个记录,我们会选择每个员工最近的记录。

    【讨论】:

      【解决方案2】:

      您可以通过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;
      

      输出:

      身份证 | EMP_CODE |最大(姓名) |状态 | OPER_DAY -: | --------: | :-------- | :----- | :----------------- 4 | 145890 |迈克 |磷 | 2020-10-05 00:00:00 3 | 164094 |约翰 |一个 | 2020-10-10 00:00:00

      db小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多