【问题标题】:Repeat data until next MAX date is found and continue - SQL SparkSQL重复数据直到找到下一个 MAX 日期并继续 - SQL SparkSQL
【发布时间】:2021-08-18 18:39:51
【问题描述】:

我有一个日历表

c_date
2020-01-01
2020-01-02
2020-01-03
2020-01-04
.....
2020-12-31

我有主表

Value col_A col_B col_C col_Date (yyyy-mm-dd)
1 A B C 2020-12-01
2 X Y Z 2020-04-02
3 X Y Z 2020-04-03

我希望输出作为日期在第二个表中从 col_Date 开始的日历天重复,并重复到下一个 MAX 日期

输出应该是:

col_A col_B col_C c_Date value
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 个数据)。但是下一条记录应该继续重复到年底,并且应该从那个月的 MAX 日期开始。

我尝试了什么:相关查询,在 SQL Server 中有效,但在 SparkSQL (Databricks) 中无效

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 中工作。不需要使用 Co-relation 注意:它应该只从那个月的 MAX 开始。请帮忙重写查询。

【问题讨论】:

    标签: sql apache-spark-sql


    【解决方案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)
    

    【讨论】:

    • 非常感谢。 !这个lead() 是主角,我错过了。非常感谢
    猜你喜欢
    • 2015-07-19
    • 2020-09-19
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多