#sql #apache-spark-sql
Вопрос:
У меня есть таблица календаря
c_date |
---|
2020-01-01 |
2020-01-02 |
2020-01-03 |
2020-01-04 |
….. |
2020-12-31 |
У меня есть главный стол
Ценность | col_A | col_B | col_C | col_Date (гггг-мм-дд) |
---|---|---|---|---|
1 | A | B | C | 2020-12-01 |
2 | X | Y | Z | 2020-04-02 |
3 | X | Y | Z | 2020-04-03 |
Я хочу, чтобы вывод в виде даты повторялся в течение календарных дней, начиная с даты col_Date во второй таблице, и повторялся до следующей МАКСИМАЛЬНОЙ даты
Результат должен быть:
col_A | col_B | col_C | c_Date | ценность |
---|---|---|---|---|
A | B | C | 2020-12-01 | 1 |
A | B | C | 2020-12-02 | 1 |
.. | .. | .. | 2020-04-02 | 1 |
X | Y | Z | 2020-04-03 | 3 |
… | … | … | … | 3 |
X | Y | Z | 2020-12-31 | 3 |
Пояснение : Первая запись должна повторяться до 2020-04-02.( Потому что там есть данные 1 ). Но следующая запись должна повторяться до конца года, и она должна принимать значение с МАКСИМАЛЬНОЙ даты этого месяца.
Что я пробовал: Коррелированный запрос, который работает в SQL Server, но не в SparkSQL (базы данных)
select A, B, C, c_date FROM calendar_table x
inner join main_table m on x.col_date = (select max(c_date) from main_table h
where h.A = m.A and h.B = m.b and h.C = m.C and h.c_date <= x.col_date )
where 1=1
НЕ работает в SparkSQL . Нужно обойтись без использования взаимосвязи
ПРИМЕЧАНИЕ : Он должен начинаться только с МАКСИМАЛЬНОГО числа этого месяца. Пожалуйста, помогите переписать запрос.
Ответ №1:
Используйте lead()
, чтобы получить следующую дату, а затем join
:
select m.col_A, m.col_B, m.col_C, c.c_Date, m.value
from (select m.*,
lead(c_date) over (order by c_date) as next_date
from maintable m
) m join
calendar c
on c.c_date >= m.c_date and
(c.date < m.next_date or m.next_date is null)
Комментарии:
1. Большое спасибо. ! Эта зацепка() и есть та зацепка, которой мне не хватало. Большое спасибо