在该列中填充具有最高优先级元素的列

时间:2015-04-20 11:37:50

标签: sql oracle

具有指定的订单:max>平均> min(列表 [max,avg,min] ),如何使用该列中可用优先级最高的元素填充列?

例如:C =列名,T =表名

(1)

输入:

C
--
min
max
avg
avg
max

输出:

max
max
max
max
max

(2)

输入:

C
--
min
avg
min

输出:

avg
avg
avg

(3)

输入:

C
--
min
min

输出:

min
min

我尝试使用case来建立上面的订单,但我无法构建完整的查询。

我想要一个使用纯SQL而不是PL / SQL的解决方案。

2 个答案:

答案 0 :(得分:4)

如果我理解正确,您只需要基于max>的特殊订购;平均>分钟。您可以使用case语句和窗口函数执行此操作:

select (case when overall_priority = 3 then 'max'
             when overall_priority = 2 then 'avg'
             when overall_priority = 1 then 'min'
        end) as newcol
from (select t.*,
             max(case when c = 'max' then 3
                      when c = 'avg' then 2
                      when c = 'min' then 1
                  end) over () as overall_priority
      from table t
     ) t;

答案 1 :(得分:3)

您可以使用FIRST_VALUE分析函数:

SELECT FIRST_VALUE( C )
         OVER ( ORDER BY CASE C WHEN 'max' THEN 3
                                WHEN 'avg' THEN 2
                                WHEN 'min' THEN 1
                                ELSE 0 END DESC )
FROM   T;

如果动态提供列表,则可以使用:

SELECT FIRST_VALUE( C )
         OVER ( ORDER BY CASE INSTR( :list, C )
                              WHEN 0 THEN NULL
                              ELSE INSTR( :list, C ) END ASC NULLS LAST )
FROM   T;

即。如果您设置:list := 'max,avg,min';,那么它将提供与第一个查询相同的结果。