Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка / 3 сообщений из 3, страница 1 из 1
25.08.2021, 20:41
    #40093190
Martini45
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
Добрый день, помогите сделать группировку:
Сгруппировать записи с одинаковым ID в одну строку по такому алгоритму: для NAME,CCODE выбрать не пустое значение со строки с максимальным CLASS в рамках одного ID.
Пример:
ID | CLASS | NAME | CCODE
123 | 2 |null | op
123 | 1 | Marina | null
123 | 3 | Alex | null


Должно быть:
ID CLASS NAME CCODE
123 | 3 | Alex | op

Пробовал через ROW_NUMBER(), но что-то не выходит.

Заранее спасибо!
...
Рейтинг: 0 / 0
25.08.2021, 23:05
    #40093199
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
Martini45,

какой результат должен быть в поле Class? Если такой набор данных:
ID | CLASS |NAME |CCODE
123 |2 |null | op
123 |1 |Marina | null
123 |3 |Alex | null
123 |4 |null | null
...
Рейтинг: 0 / 0
25.08.2021, 23:06
    #40093200
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка
Martini45,

Код: plsql
1.
2.
3.
4.
5.
6.
select
  id
 ,max(name )keep(dense_rank last order by case when name  is not null then t.class end nulls first) name
 ,max(ccode)keep(dense_rank last order by case when ccode is not null then t.class end nulls first) ccode
from t
group by id


или покороче через nvl2:
Код: plsql
1.
2.
3.
4.
5.
6.
select
  id
 ,max(name )keep(dense_rank last order by nvl2(name ,t.class,null) nulls first) name
 ,max(ccode)keep(dense_rank last order by nvl2(ccode,t.class,null) nulls first) ccode
from t
group by id;


пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> ;
  1  with t(ID, CLASS, NAME, CCODE) as (
  2  select 123 ,2 ,null     , 'op' from dual union all
  3  select 123 ,1 ,'Marina' , null from dual union all
  4  select 123 ,3 ,'Alex'   , null from dual
  5  )
  6  select
  7    id
  8   ,max(name )keep(dense_rank last order by nvl2(name ,t.class,null) nulls first) name
  9   ,max(ccode)keep(dense_rank last order by nvl2(ccode,t.class,null) nulls first) ccode
 10  from t
 11* group by id
SQL> /

        ID NAME   CC
---------- ------ --
       123 Alex   op

...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]