Повторяйте данные до тех пор, пока не будет найдена следующая МАКСИМАЛЬНАЯ дата, и продолжайте — SQL SparkSQL

#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. Большое спасибо. ! Эта зацепка() и есть та зацепка, которой мне не хватало. Большое спасибо