1

在此处输入图像描述

我有一个 TTable TABLE1 并且有 ID、Status 和 Code 等列

基于我想要输出的代码优先级,优先级是

SS -> RR -> TT -> AA(这些优先级不存储在任何表中)

查询应首先查找 Approved 状态,然后我们需要检查 Code 列 Example1:ID:2345 - 此记录具有所有代码(如 SS、AA 和 RR)的 Approved 状态,并且基于代码优先级 SS 应在输出中拉取为2345,党卫军

示例 2:ID:3333- 此记录具有所有代码(如 RR 和 TT)的已批准状态并基于代码优先级 RR,应在输出中拉取为 3333, RR

ID:4444-尽管此记录具有 SS 和 RR 之类的代码,但它的状态列的值为 TERMED,因此我们需要填充列表中的下一个优先级,输出应显示为 4444 TT

ID:5555-此 ID 的所有状态均未处于已批准状态,所有状态均处于已终止状态,因此根据输出 55​​55 中的优先级,应选择 SS,因为这是优先级

所以 2345 和 5555 的输出是相同的,唯一的区别是如果没有记录具有已批准状态,那么只有我们应该选择 Termed - 如果记录只是有 termed 则应根据优先级记录拉出

附上图片供参考

4

2 回答 2

0
create table table1 (id, status, code) as
select 2345, 'Approved', 'SS' from dual union all
select 2345, 'Approved', 'AA' from dual union all
select 2345, 'Approved', 'RR' from dual union all
select 3333, 'Approved', 'RR' from dual union all
select 3333, 'Approved', 'TT' from dual union all
select 4444, 'TERMED', 'SS' from dual union all
select 4444, 'TERMED', 'RR' from dual union all
select 4444, 'Approved', 'TT' from dual
;

select ID, CODE
from (
  select ID, STATUS, CODE
    , row_number()over( 
            partition by ID 
            order by status
                     , decode(code, 'SS', 1, 'RR', 2, 'TT', 3, 'AA', 4) ) rank
  from table1
)
where rank = 1
;
于 2020-12-07T10:44:29.977 回答
0

您可以RANKCASE表达式一起使用来进行排序:

WITH cte AS (
    SELECT t.*,
           RANK() OVER (PARTITION BY ID
                        ORDER BY CASE Status WHEN 'Approved' THEN 1
                                             WHEN 'Termed'   THEN 2
                                             ELSE 3 END,
                                 CASE Code WHEN 'SS' THEN 1
                                           WHEN 'RR' THEN 2
                                           WHEN 'TT' THEN 3
                                           WHEN 'AA' THEN 4 END) rnk
    FROM yourTable t
    WHERE Status = 'Approved'
)

SELECT ID, Code
FROM cte
WHERE rnk = 1;

演示

于 2020-12-07T10:28:24.863 回答