powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка
3 сообщений из 3, страница 1 из 1
Группировка
    #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
Группировка
    #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
Группировка
    #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
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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