|
with t as(select 0.3 b, 4 lvl from dual union select 0.2, 3 from dual union select 0.1, 2 from dual union select 0.4,1 from dual )
,t2 as (select power(2,row_number() over(order by lvl desc)-1) bit,b,lvl from t)
select n,lvl,decode(rn,1,b+s,b)
from (
select n
,t2.b
,t2.lvl
,nvl(sum(case when bitand(n,bit)=0 then b end) over(partition by n),0) s
,bitand(n,bit) flag
,row_number() over(partition by n order by case when bitand(n,bit)>0 then t2.lvl end desc nulls last) rn
from (select level n from dual connect by level<=(select power(2,count(*))-1 from t))
,t2
)
where flag>0;
|
|