交叉联接两个大表以获得总运行量的有效替代方法是什么?

时间:2018-07-27 00:49:37

标签: sql hive running-total cumulative-sum cross-join

我有2个表,它们的架构如下: table1

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

表: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中每个日期的累积运行总计。例如,第一个事件的日期是07/01/2018,但是表1中的第一个日期是06/30/2018,因此最终输出6/30/2018中将不存在。

此方法的问题是交叉连接花费的时间太长,因为每6秒进行一次观察,所以我有数百万条记录。因此,有一种方法可以得到相同的结果而无需交叉连接,或者通过任何一种更有效的方式。

1 个答案:

答案 0 :(得分:2)

我认为最好的方法是使用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;