【问题标题】:What is an efficient alternative to cross join two large tables to get running total?交叉连接两个大表以获得运行总数的有效替代方法是什么?
【发布时间】:2019-01-04 01:36:37
【问题描述】:

我有 2 个表,其架构如下: 表 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

表: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,因此最终输出中不会出现 2018 年 6 月 30 日。

这种方法的问题是交叉连接耗时太长,我有数百万条记录,因为每 6 秒进行一次观察。所以有没有一种方法可以在没有交叉连接的情况下获得相同的结果,或者任何更有效的方法。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql hive cumulative-sum cross-join


【解决方案1】:

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

【讨论】:

  • 最后一个条件不起作用。我想出了一个使用左连接的替代方法,然后得到运行总数。涉及相同数量的步骤。
  • @Raj 。 . .这应该比join/group by 更有效率。
  • 嗨,代码抛出错误,指出time 列不存在。在计算运行时间的第二个外部“tt”子查询中只有新的runnint总正确,所以外部的where条件无法过滤“时间”字段,还是我的理解错误?
  • @Raj 。 . .它很容易包含在子查询中。
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多