【问题标题】:Repeat same Data for Calendar Date in SparkSQL在 SparkSQL 中为日历日期重复相同的数据
【发布时间】:2021-08-15 22:41:59
【问题描述】:

我有一个日历表

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

我有主表

ID col_A col_B col_C col_Date
1 A B C 2020-05-05
2 A B C 2020-04-05
3 X Y Z 2020-02-02

我希望作为日期的输出在第二个表中从 col_Date 开始的日历天重复。

输出应该是:

col_A col_B col_C c_Date
A B C 2020-05-05
A B C 2020-05-06
A B C 2020-05-07
... ... ... ...
A B C 2020-12-31
X Y Z 2020-02-02
X Y Z 2020-02-03
X Y Z 2020-02-04
... ... ... ...
X Y Z 2020-12-31

我尝试了什么:相关查询,在 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 中工作 注意:它应该只从那个月的 MAX 开始。请帮忙重写查询。

【问题讨论】:

  • 语句select col_A, col_B, col_C, c_Date from calendar_table c join main_table m on m.col_Date &lt;= c.c_Date 返回预期结果。但是查看您的查询,问题中可能缺少有关主表的一些详细信息?
  • 数据的重复应该从col_date的MAX开始。为了适应这一点,我使用了子查询。但不知何故,对于 1 个数据来说它很好,对于多个数据,重复即将到来。
  • 我又编辑了 1 行。它澄清了输出。
  • 对于更新后的主表,我第一条评论中的语句在我的测试中返回了预期的结果。你会得到哪个结果?
  • 是的,只有当该月存在 1 条记录时,此查询才会起作用。如果存在 2 条记录,我需要为该月取 MAX date 并重复。相关性问题来了。

标签: sql apache-spark apache-spark-sql


【解决方案1】:

您可以使用with statement 从主表中计算每个col_Acol_Bcol_C 组合的最大日期,然后将日历表中晚于或等于该最大日期的所有日期连接起来.

with max_date (date, col_A, col_B, col_C) as 
  (select max(col_Date) as date, col_A, col_B, col_C from main_table 
    group by col_A, col_B, col_C)
select c_date, col_A, col_B, col_C from max_date h 
join calendar_table c on c.c_date >= h.date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多