Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Джойн различных диапазонов дат / 8 сообщений из 8, страница 1 из 1
24.09.2018, 10:16
    #39706808
Eneimor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
Доброго времени суток, господа.

Возникла острая необходимость связать две таблицы, однако испытал при этом первую трудность.
Первая таблица имеет следующий вид:

idtransdateamount1562018-01-02500.651562018-01-03500.651562018-01-04500.65231 2018-01-04 1.12231 2018-01-05 15.121562018-01-05326.99231 2018-01-06 15.12231 2018-01-07 15.12231 2018-01-0899.991562018-01-061569.29

Остаток на каждый день текущего года

И вторая:

idtransdateudep dperiod ...1562017-11-300 56 ...231 2018-01-05112 ...

Задача заключается в том, чтобы соединить эти таблицы по датам и ид, однако в первой есть даты только за текущий год, а во второй выборочно за ~10 лет. Каким способом можно соотнести записи (и можно ли?), чтобы был результат вида:

idtransdateudep dperiod1562018-01-020 561562018-01-030 561562018-01-040 56231 2018-01-04 nullnull231 2018-01-05 1121562018-01-050 56231 2018-01-06 112231 2018-01-07 112231 2018-01-081121562018-01-060 56

Периоды везде плавают, закономерности нет, разброс большой, чтобы можно было взять просто смещение. Как можно сделать, кто сталкивался или знает как решить сию проблему, не могли бы посоветовать.
Спасибо
...
Рейтинг: 0 / 0
24.09.2018, 11:10
    #39706840
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
Eneimor,

Постановка задачи - 2
Подогнал под ответ:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t1 as (
select 156 id,	to_date('2018-01-02','YYYY-MM-DD') transdate, 500.65 amount from dual union all
select 156 id,	to_date('2018-01-03','YYYY-MM-DD') transdate, 500.65 amount from dual union all
select 156 id,	to_date('2018-01-04','YYYY-MM-DD') transdate, 500.65 amount from dual union all
select 231 id,	to_date('2018-01-04','YYYY-MM-DD') transdate, 1.12 amount from dual union all
select 231 id,	to_date('2018-01-05','YYYY-MM-DD') transdate, 15.12 amount from dual union all
select 156 id,	to_date('2018-01-05','YYYY-MM-DD') transdate, 326.99 amount from dual union all
select 231 id,	to_date('2018-01-06','YYYY-MM-DD') transdate, 15.12 amount from dual union all
select 231 id,	to_date('2018-01-07','YYYY-MM-DD') transdate, 15.12 amount from dual union all
select 231 id,	to_date('2018-01-08','YYYY-MM-DD') transdate, 99.99 amount from dual union all
select 156 id,	to_date('2018-01-06','YYYY-MM-DD') transdate, 1569.29 amount from dual)
, t2 as (
select 156 id,	to_date('2017-11-30','YYYY-MM-DD') transdate, 0 udep, 56 dperiod from dual union all
select 231 id,	to_date('2018-01-05','YYYY-MM-DD') transdate, 1 udep, 12 dperiod from dual)

select t1.id, t1.transdate 
  ,last_value(t2.udep) over (partition by t1.id order by t2.transdate desc) udep
  ,last_value(t2.dperiod) over (partition by t1.id order by t2.transdate desc) dperiod
 from t1 left join t2 on (t1.id = t2.id and t1.transdate >= t2.transdate)
order by t1.transdate 
...
Рейтинг: 0 / 0
24.09.2018, 11:30
    #39706858
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
Eneimor,

Сам селект неправильный он только показывает направление мысли ... такое же туманное как и описание задачи
А какой Oracle?
...
Рейтинг: 0 / 0
24.09.2018, 11:54
    #39706883
Eneimor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
MaximaXXL,

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Описание задачи, если вдаваться в большие подробности, выглядит так, есть таблица фактов, где хранятся операции начисления и списания по договорам, счетам и т.д. с 2001 года, кажется, может еще раньше. Захотели, чтобы с начала года на каждый день формировался остаток по каждому договору, с учетом периода возникновения задолженности. Был рассчитан остаток на каждый день текущего года и вынесен в отдельную таблицу, в другую периоды возникновения и прочие другие моменты. Но соль в том, что возникновение было не только в этом году, а еще в более ранние годы. Вот и встал вопрос как их сджойнить, потому что больше связи, по сути, нету, а рассчитывать на каждый день за это время слишком уж муторно, т.к. на один год придется вносить ~18 млн. новых записей, что не есть хорошо, да и совсем не нужно. Пробовал просто нарастающим итогом, пробовал через джойны, джойны через смещение, просто аналитические функции, но что-то никак не выходит.
...
Рейтинг: 0 / 0
24.09.2018, 11:56
    #39706886
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
select id, transdate, null as udep, null as dperiod from t1
union all
select id, transdate, udep, dperiod from t2
where trunc(transdate,'Y')=2018
...
Рейтинг: 0 / 0
24.09.2018, 12:34
    #39706918
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
EneimorКаким способом можно соотнести записи (и можно ли?), чтобы был результат вида:

для ид с второй таблицы, заменить в первой таблице amount на dperiod после даты из второй, для предыдущих дат null?

.....
stax
...
Рейтинг: 0 / 0
24.09.2018, 12:36
    #39706923
Eneimor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
Alibek B.,

Что-то не слишком помогло..но все равно спасибо
...
Рейтинг: 0 / 0
24.09.2018, 12:39
    #39706925
Eneimor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Джойн различных диапазонов дат
ну да, именно так
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Джойн различных диапазонов дат / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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