# #sql #google-bigquery
Вопрос:
у меня есть 2 стола. первая таблица-total_payment, а вторая таблица-Schedule_down.
итого выплат
ID | дата платежа | накопленный_тотал_платеж |
---|---|---|
ААА | 2020-01-12 | 105 |
ААА | 2020-01-13 | 110 |
ААА | 2020-01-14 | 120 |
ААА | 2020-01-15 | 125 |
ААА | 2020-01-16 | 125 |
ААА | 2020-01-17 | 150 |
Schedule_down
ID | Расписание дат | график платежей |
---|---|---|
ААА | 2020-01-11 | 110 |
ААА | 2020-01-13 | 120 |
ААА | 2020-01-15 | 130 |
ААА | 2020-01-16 | 140 |
ААА | 2020-01-18 | 150 |
как я могу присоединиться из таблицы total_payment к Schedule_down, чтобы получить расписание последних дат на основе накопленного итого платежа
мой ожидаемый результат таков
ID | дата платежа | накопленный_тотал_платеж | Расписание дат |
---|---|---|---|
ААА | 2020-01-12 | 105 | 2020-01-11 |
ААА | 2020-01-13 | 110 | 2020-01-11 |
ААА | 2020-01-14 | 120 | 2020-01-14 |
ААА | 2020-01-15 | 125 | 2020-01-15 |
ААА | 2020-01-16 | 125 | 2020-01-15 |
ААА | 2020-01-17 | 150 | 2020-01-18 |
кто-нибудь может помочь ? Огромное спасибо!
Ответ №1:
Попробуйте следующий подход
select any_value(tp).*, min(sd.Date_schedule) Date_schedule
from total_payment tp
join Schedule_down sd
on tp.ID = sd.ID
and accumulated_total_payment <= payment_schedule
group by to_json_string(tp)
если применить к образцам данных в вашем вопросе — вывод будет
Ответ №2:
Вы можете использовать lead()
и join
:
select p.*, sd.Date_schedule
from total_payment p left join
(select sd.*,
lead(Date_schedule) over (partition by id order by Date_schedule) as next_Date_schedule
from schedule_down sd
) sd
on p.id = sd.id and
p.date >= s.Date_schedule and
(p.date < s.next_Date_schedule or s.next_Date_schedule is null);
В принципе, это помещает дату «окончания» в каждую schedule_down
строку, а затем использует ее для сопоставления.