powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выбрать значения
11 сообщений из 11, страница 1 из 1
Выбрать значения
    #39820040
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица А и таблица В. В обоих содержаться даты и данные. Нужно найти значения в таблице А, которым соответствуют данные Б, учитывая, что в Б даты хранятся не на каждый день и если в этот день нет данных, берём данные за ближайший день в прошлом, где есть значения. Я решила это с помощью создания таблицы-календаря и last_value, мне сказали, что это не оптимальное решение. Есть ли ещё решения?
...
Рейтинг: 0 / 0
Выбрать значения
    #39820048
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Left join A,B + LAST_VALUE

SY.
...
Рейтинг: 0 / 0
Выбрать значения
    #39820049
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYLeft join A,B + LAST_VALUE(B.данные) OVER(ORDER BY B.датa NULLS LAST)

SY.
Я почти это и предложила. Сказали - неоптимально.
...
Рейтинг: 0 / 0
Выбрать значения
    #39820050
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnitaBellsЯ решила это с помощью создания таблицы-календаря

это, видимо, было лишним
...
Рейтинг: 0 / 0
Выбрать значения
    #39820063
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПосетительAnnitaBellsЯ решила это с помощью создания таблицы-календаря

это, видимо, было лишним

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with a as (select to_date('2019-01-01','YYYY-DD-MM') A_DATE, 11 A_VALUE from dual
           UNION ALL
           select to_date('2019-01-02','YYYY-DD-MM') A_DATE, 12 A_VALUE from dual
           UNION ALL
           select to_date('2019-07-04','YYYY-DD-MM') A_DATE, 47 A_VALUE from dual
           UNION ALL
           select to_date('2019-12-07','YYYY-DD-MM') A_DATE, 127 A_VALUE from dual
           UNION ALL
           select to_date('2019-07-12','YYYY-DD-MM') A_DATE, 712 A_VALUE from dual

),
b as (select to_date('2019-17-05','YYYY-DD-MM') B_DATE, 175 B_VALUE from dual
           UNION ALL
           select to_date('2018-12-07','YYYY-DD-MM'), 18127 from dual
           UNION ALL
           select to_date('2019-07-01','YYYY-DD-MM'), 71 from dual
           UNION ALL
           select to_date('2019-12-07','YYYY-DD-MM'), 127 from dual
           UNION ALL
           select to_date('2019-07-12','YYYY-DD-MM'), 712 from dual)
    select a.*, b.*, LAST_VALUE(b.b_value) over (order by b.b_date nulls last) from a left join b on (a.a_date = b.b_date) 
    order by a.a_DATE



oracle01.01.2019 00:00:00 11
01.02.2019 00:00:00 12
07.04.2019 00:00:00 47
12.07.2019 00:00:00 127 12.07.2019 00:00:00 127 127
07.12.2019 00:00:00 712 07.12.2019 00:00:00 712 712

А мне надо без null.
...
Рейтинг: 0 / 0
Выбрать значения
    #39820066
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На поиграться:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select a.*, b.*
  from a
     , lateral(select * from b where b_date = (select max(b_date) from b where b_date <= a_date))(+) b
 order by a_date
;

select a.*
     , (select max(b_value) keep (dense_rank last order by b_date) from b where b_date <= a_date) b_value
  from a
 order by a_date
;
...
Рейтинг: 0 / 0
Выбрать значения
    #39820070
AnnitaBells
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

спасибище!
...
Рейтинг: 0 / 0
Выбрать значения
    #39820073
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Играть так играть...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select x.date_a a_date, x.value_a a_value, x.b_date, x.b_value 
from (select a_date, a_value, 'a' d from a
   union all select b_date, b_value, 'b' d  from b
) match_recognize(order by a_date
measures last (a_date) as date_a
       , last (a_value) as value_a
       , b.a_date as b_date
       , b.a_value as b_value
all rows per match       
pattern (b a+)
define b as d='b', a as d='a'
) x
where x.d='a'
;



Коллеги и на модельке вариант подкинут, наверное, мне уже лень.
...
Рейтинг: 0 / 0
Выбрать значения
    #39820075
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остапа несло...
Код: plsql
1.
2.
3.
4.
5.
6.
select a_date, a_value, b_date, b_value 
  from a
     , (select b.*, lead(b_date-1/86400,1,date'3000-01-01') over(order by b_date) b_date_till from b) b
 where a_date between b_date and b_date_till     
order by a_date 
;
...
Рейтинг: 0 / 0
Выбрать значения
    #39820099
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnnitaBellsА мне надо без null.
Код: plsql
1.
last_value(b.b_value ignore nulls) over (order by nvl(a.a_date, b.b_date))

+ полное соединение и сверху на inline view натянуть фильтр по а.
andrey_anonymous
Код: plsql
1.
pattern ({-b-} a+)


where не нужно.
Ну и мы понимаем какое горе будет, если до первого а нет ни одного б.
...
Рейтинг: 0 / 0
Выбрать значения
    #39820188
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

order by a_date,d desc ?

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


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