具有指定的订单:max>平均> min(列表: [max,avg,min] ),如何使用该列中可用优先级最高的元素填充列?
例如:C =列名,T =表名
输入:
C
--
min
max
avg
avg
max
输出:
max
max
max
max
max
输入:
C
--
min
avg
min
输出:
avg
avg
avg
输入:
C
--
min
min
输出:
min
min
我尝试使用case
来建立上面的订单,但我无法构建完整的查询。
我想要一个使用纯SQL而不是PL / SQL的解决方案。
答案 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';
,那么它将提供与第一个查询相同的结果。