получить значения с высокой стоимостью sql - PullRequest
0 голосов
/ 11 марта 2019

приведена следующая таблица (в Oracle);

LVL	KID	    FATHER
1	  POD001	DPR001
1	  POD002	DPR002
1	  POD003	POD002
2	  POD003	DPR002
2	  POD004	DPR001
1	  POD004	POD001
2	  POD005	POD002
1	  POD005	POD003
3	  POD005	DPR002

Я хочу, чтобы для всех детей был отец.Если существует более одного отца (POD003, POD004 и POD005), возьмите значение с наибольшим значением из столбца LVL.

Результат должен быть таким;

   LVL	  KID	      FATHER
    1	  POD001	DPR001
    1	  POD002	DPR002
    2	  POD003	DPR002
    2	  POD004	DPR001
    3	  POD005	DPR002

Спасибо за вашу помощь.

С уважением, Сердар

Ответы [ 3 ]

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

Вы можете использовать агрегацию в Oracle:

select max(lvl) as lvl, kid,
       max(father) keep (dense_rank first order by lvl desc) as father
from t
group by kid;

Ключевое слово keep используется (в данном случае) для реализации функции агрегирования «первое значение».На практике я считаю, что это работает очень эффективно.

Конечно, вы можете сравнить его с другими методами, такими как:

select t.*
from t
where t.lvl = (select max(t2.lvl) from t t2 where t2.kid = t.kid);
0 голосов
/ 11 марта 2019

использование row_number() функция Windows

with cte as
(
 select *,row_number()over(partition by kid order by lvl desc) rn
 from table_table
) select * from cte where cte.rn=1
0 голосов
/ 11 марта 2019

Вы группируете по ребенку и получаете максимальный уровень и присоединяетесь к основному столу:

select t.*
from tablename t inner join (
  select kid, max(lvl) maxlvl 
  from tablename
  group by kid
) g
on g.kid = t.kid and g.maxlvl = t.lvl
order by t.kid

См. демо

или с NOT EXISTS:

select t.*
from tablename t
where not exists (
  select 1 from tablename
  where kid = t.kid and lvl > t.lvl
)
order by t.kid

См. Демоверсию

...