什么是交叉连接两个大表以运行total的有效替代方法?

r6hnlfcb  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(388)

我有两个表,其模式如下:表1

event_dt
6/30/2018
7/1/2018
7/2/2018
7/3/2018
7/4/2018
7/5/2018
7/6/2018
7/7/2018
7/8/2018
7/9/2018
7/10/2018

table:2

event_dt    time(in seconds)
7/7/2018     144 
7/8/2018     63 
7/1/2018     47 
7/8/2018     81 
7/9/2018     263 
7/7/2018     119 
7/8/2018     130 
7/9/2018     206 
7/5/2018     134 
7/1/2018     140

对于表1中的每个日期,我希望找到截至该日期的累计时间总和。因此,我使用交叉连接来获取输出,使用以下代码:

select t1.event_dt, sum(t2.time)
from yp1 t1 cross join yp2 t2
where t1.event_dt>=t2.event_dt
group by t1.event_dt

使用这个查询,我可以得到表1中每个日期的累计运行总数,只要在该日期之前有一个事件。例如,第一个事件日期是2018年1月7日,但表1中的第一个日期是2018年6月30日,因此最终输出中不会出现2018年6月30日。
这个方法的问题是交叉连接花费的时间太长,自从每6秒进行一次观察以来,我有数百万条记录。那么有没有一种方法可以在没有交叉连接的情况下得到相同的结果,或者有没有更有效的方法呢。

wqsoz72f

wqsoz72f1#

我认为最好的方法是使用sql的累积和函数:

select event_dt, running_time
from (select event_dt, time, sum(time) over (order by event_dt) as running_time
      from ((select event_dt, null as time
             from t1
            ) union all
            (select event_dt, time
             from t2
            ) 
           ) tt
     ) tt
where time is null;

相关问题