Обновление столбца при сравнении значения двух строк из одной таблицы - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь отформатировать мой результат следующим образом:

ID    pred  probability cost  
101   1     0.15        0.9  
101   2     0.85        0.1  
102   2     0.25        0.55  
102   1     0.75        0.44 

Требуемый формат должен получить столбец результатов на основе более высокой вероятности, например, для ID 101 вероятность pred значение '2' выше, поэтому столбец результата будет иметь '2' в качестве значения для ID '101':

ID    result  pred  cost  
101   2       1     0.9  
101   2       2     0.1  
102   1       2     0.55  
102   1       1     0.44  

Я пытался получить максимум probability, группируя на основе ID, например:

SELECT  
   ID,  
    MAX(probability) prob  
FROM  
    table  
GROUP BY  
    ID  

и объединение других строк на основе ID и probability, например:

with temp as (  
SELECT  
        ID,  
        MAX(probability) prob  
    FROM  
        table  
    GROUP BY  
        ID  
)  
select id,
base.ID, base.pred, base.cost
from base
where temp.ID = base.ID and base.probability = temp.prob

но не получается ожидаемый результат. Есть предложения?

Ответы [ 3 ]

1 голос
/ 18 марта 2019

использование last_value функция

LAST_VALUE(pred) IGNORE NULLS
         OVER (PARTITION BY ID ORDER BY probability ROWS BETWEEN
           UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS result

Демо

0 голосов
/ 18 марта 2019
with s  (ID, pred, probability, cost) as (
select 101,   1,     0.15,        0.9  from dual union all
select 101,   2,     0.85,        0.1  from dual union all
select 102,   2,     0.25,        0.55 from dual union all
select 102,   1,     0.75,        0.44 from dual)
select
s.*,
nth_value(pred, 1) ignore nulls over (partition by id order by probability desc) nth
from s
order by id, probability;

        ID       PRED PROBABILITY       COST        NTH
---------- ---------- ----------- ---------- ----------
       101          1         .15         .9          2
       101          2         .85         .1          2
       102          2         .25        .55          1
       102          1         .75        .44          1
0 голосов
/ 18 марта 2019

использовать оконную функцию

 with cte as

(
select 101 as id, 1 as pred, 0.15 as pro, 0.9 as cost from dual
union all
select 101,2,0.85,0.1 from dual
union all
select 102,2,0.25,0.55 from dual
union all
select 102,1,0.75,.44 from dual
)
, cte1 as
(
select t.*,  max(pro) over(partition by ID) as result
from cte t
) select cte1.id,cte.pred as result,cte1.pred,cte1.cost 
from cte1 left join cte on cte1.result=cte.pro
 order by cte1.ID,cte1.cost desc,cte1.pred

вывод

    ID  RESULT  PRED    COST
   101      2     1     .9
   101      2     2     .1
   102      1     2     .55
   102      1     1     .44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...