powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Джойн различных диапазонов дат
8 сообщений из 8, страница 1 из 1
Джойн различных диапазонов дат
    #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
Джойн различных диапазонов дат
    #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
Джойн различных диапазонов дат
    #39706858
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eneimor,

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

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

Описание задачи, если вдаваться в большие подробности, выглядит так, есть таблица фактов, где хранятся операции начисления и списания по договорам, счетам и т.д. с 2001 года, кажется, может еще раньше. Захотели, чтобы с начала года на каждый день формировался остаток по каждому договору, с учетом периода возникновения задолженности. Был рассчитан остаток на каждый день текущего года и вынесен в отдельную таблицу, в другую периоды возникновения и прочие другие моменты. Но соль в том, что возникновение было не только в этом году, а еще в более ранние годы. Вот и встал вопрос как их сджойнить, потому что больше связи, по сути, нету, а рассчитывать на каждый день за это время слишком уж муторно, т.к. на один год придется вносить ~18 млн. новых записей, что не есть хорошо, да и совсем не нужно. Пробовал просто нарастающим итогом, пробовал через джойны, джойны через смещение, просто аналитические функции, но что-то никак не выходит.
...
Рейтинг: 0 / 0
Джойн различных диапазонов дат
    #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
Джойн различных диапазонов дат
    #39706918
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EneimorКаким способом можно соотнести записи (и можно ли?), чтобы был результат вида:

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

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

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


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