【问题标题】:Merging the two tables using sql / Spark使用 sql / Spark 合并两个表
【发布时间】:2018-07-08 15:25:00
【问题描述】:

我有如下两个数据集,需要根据日期范围逻辑合并两个数据集。请提出任何想法?驱动表是A

    Table A     
UID Start Date  End Date                    A_Val
1   1980-01-01 00:00:00 1980-02-01 00:00:00 A
1   1980-02-02 00:00:00 1980-03-10 00:00:00 B
1   1980-03-11 00:00:00 1980-03-24 00:00:00 C

    Table B     
UID Start Date             End Date         B_Val
1   1980-01-10 00:00:00 1980-02-01 00:00:00 G
1   1980-02-02 00:00:00 1980-03-01 00:00:00 H
1   1980-03-02 00:00:00 1980-03-24 00:00:00 I

结果/输出需要如下

UID Start Date  End Date    A_Val   B_Val
1   1980-01-01 00:00:00 1980-01-09 00:00:00 A   NULL
1   1980-01-10 00:00:00 1980-02-01 00:00:00 A   G
1   1980-02-02 00:00:00 1980-03-01 00:00:00 B   H
1   1980-03-02 00:00:00 1980-03-10 00:00:00 B   I
1   1980-03-11 00:00:00 1980-03-24 00:00:00 C   I

Table Detail

根据日期范围计算需要如下输出

out put of Merged Table

【问题讨论】:

  • 这里的大多数人想要格式化文本,而不是图像(或图像链接)。
  • 先尝试编写查询
  • 还有,这是什么逻辑?
  • 需要检查表B的每一行并检查它是否在日期范围内,如果需要根据我提到的输出结果进行拆分或合并

标签: sql database oracle apache-spark


【解决方案1】:

您可以通过多种方式做到这一点,这里是一种:

  • 从整个集合中查找最小和最大日期(子查询T),
  • 使用分层查询(子查询D)创建每天的条目,
  • 左连接数据来自AB
  • 将组分配给连续周期,具有相同的A_VALB_VAL(子查询G),
  • 使用分配的组号对数据进行分组。

SQLFiddle demo

with 
  T as (select min(start_date) sd, max(end_date) ed 
          from (select start_date, end_date from a union all
                select start_date, end_date from b)),
  D as (select sd + level - 1 dt from t connect by sd + level - 1 <= ed), 
  G as (select dt, a_val, b_val,
               row_number() over (order by dt) -
               row_number() over (partition by a_val, b_val order by dt) grp
          from d
          left join a on dt between a.start_date and a.end_date
          left join b on dt between b.start_date and b.end_date)
select min(dt) sd, max(dt) ed, min(a_val) a_val, min(b_val) b_val
  from g group by grp order by sd

结果:

SD          ED          A_VAL B_VAL
----------- ----------- ----- -----
1980-01-01  1980-01-09  A     
1980-01-10  1980-02-01  A     G
1980-02-02  1980-03-01  B     H
1980-03-02  1980-03-10  B     I
1980-03-11  1980-03-24  C     I

如果您首先为一个U_ID 过滤数据执行此操作。如果对于许多U_ID,那么您必须在分区和分组中考虑这个值。

【讨论】:

  • 是的,会有更多的 UID,比如 1,2,3,.... 等等,比如 UID 1。我们需要根据 uid 进行分组,感谢您的想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多