Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите поправить запрос с оконной функцией / 7 сообщений из 7, страница 1 из 1
14.04.2021, 11:33
    #40062343
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
Есть набор строк, которые принадлежат определенным группам.
В каждой группе может быть (а может и не быть) одна "главная" строка.
Для каждой строки набора мне нужно получить определенные данные "главной" строки.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with rs as (
  select 0 as id, '' as g, sysdate as d, 0 as v, '' as cond from dual where 0=1
  union all select 1, 'a', date'2021-01-01', 10, 'abc' from dual
  union all select 2, 'b', date'2021-01-01', 20, 'def' from dual
  union all select 3, 'b', date'2021-01-01', 15, 'abc' from dual
  union all select 4, 'c', date'2021-01-01', 30, 'qwe' from dual
  union all select 5, 'c', date'2021-01-01', 25, 'asd' from dual
  union all select 6, 'd', date'2021-01-01', 20, 'abc' from dual
  union all select 7, 'd', date'2021-01-01', 10, 'asd' from dual
  union all select 8, 'd', date'2021-01-01', 35, 'zxc' from dual
)
select rs.*
, case when cond = 'abc' then 1 end as is_root
, max(id) keep (dense_rank first order by case when cond = 'abc' then 1 end) over (partition by g) as root_id
, max(v) keep (dense_rank first order by case when cond = 'abc' then 1 end) over (partition by g) as root_v
from rs
order by 1


Не соображу, как для строк 4 и 5 убрать значения (у них нет "главной" строки и в root_* должно быть null).
...
Рейтинг: 0 / 0
14.04.2021, 11:41
    #40062350
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
Alibek B.,

может так...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with rs as (
  select 0 as id, '' as g, sysdate as d, 0 as v, '' as cond from dual where 0=1
  union all select 1, 'a', date'2021-01-01', 10, 'abc' from dual
  union all select 2, 'b', date'2021-01-01', 20, 'def' from dual
  union all select 3, 'b', date'2021-01-01', 15, 'abc' from dual
  union all select 4, 'c', date'2021-01-01', 30, 'qwe' from dual
  union all select 5, 'c', date'2021-01-01', 25, 'asd' from dual
  union all select 6, 'd', date'2021-01-01', 20, 'abc' from dual
  union all select 7, 'd', date'2021-01-01', 10, 'asd' from dual
  union all select 8, 'd', date'2021-01-01', 35, 'zxc' from dual
)
select rs.*
, case when cond = 'abc' then 1 end as is_root
, max(id) keep (dense_rank first order by case when cond = 'abc' then 1 end) over (partition by g) as root_id
, max(v) keep (dense_rank first order by case when cond = 'abc' then 1 end) over (partition by g) as root_v
, max(case when cond = 'abc' then id end) keep (dense_rank first order by case when cond = 'abc' then 1 end) over (partition by g) as root_id2
, max(case when cond = 'abc' then v end) keep (dense_rank first order by case when cond = 'abc' then 1 end) over (partition by g) as root_v2
from rs
order by 1
...
Рейтинг: 0 / 0
14.04.2021, 11:56
    #40062360
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
Да, результаты правильные, спасибо.
А что-то вроде условий внутри окна задать нельзя?
...
Рейтинг: 0 / 0
14.04.2021, 12:11
    #40062375
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
Alibek B.
А что-то вроде условий внутри окна задать нельзя?
Если рутовая запись всегда присутствует не более, чем в 1 экземпляре на группу, то вы с Бобби перестарались.
Код: plsql
1.
2.
, max(decode(cond, 'abc', id)) over (partition by g) as root_id
, max(decode(cond, 'abc',  v)) over (partition by g) as root_v
...
Рейтинг: 0 / 0
14.04.2021, 12:12
    #40062377
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
Alibek B.,

условия внутри окна применяются либо к количеству строк, либо к значениям, и определяют размер самого окна.
А значение, в данном случае, выражение, передаваемое в параметр функции.
Когда оно разумно сформулировано, можете по отношению к нему и условия внутри окна задавать.
я так думаю.
...
Рейтинг: 0 / 0
14.04.2021, 12:14
    #40062380
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
AmKad,
бу(у)би - баклан, морская птичка.
...
Рейтинг: 0 / 0
14.04.2021, 12:47
    #40062401
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите поправить запрос с оконной функцией
AmKad
Если рутовая запись всегда присутствует не более, чем в 1 экземпляре на группу, то вы с Бобби перестарались.

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


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