Sql笛卡尔积(与分组相加)

时间:2017-09-08 09:51:49

标签: sql group-by sas query-optimization cartesian-product

我正在尝试计算表important_stock_dates中特定日期的一组股票的最近30天的交易量总和。表all_stock_dates包含相同的股票,但交易量适用于所有日期,而不仅仅是特定日期。

示例数据

all_stock_dates

stockid, date, volume  
0231245, 20060314, 153  
0231245, 20060315, 154  
2135411, 20060314, 23  

important_stock_dates

stockid, date, thirtydaysprior  
0231245, 20060314, 20060130  
0231245, 20060315, 20060201  
2135411, 20060314, 20060130  

我的代码

create table sum_trading_volume as
select a.stockid, a.date, sum(b.volume) as thirty_day_volume
from important_stock_dates a, all_stock_dates b
where b.date<a.date AND b.date ge a.thirtydaysprior
group by a.stockid, a.date;

期望的结果

包含来自important_stock_dates的所有观察结果的表格,其中还包含基于匹配的stockid和all_stock_dates中的日期的前30天的总和。

问题

我遇到的问题是important_stock_dates有1500万观察,all_stock_dates有3.5亿。它耗尽了几百GB的交换文件运行此代码(最大化硬盘驱动器)然后中止。我无法看到如何优化代码。我无法在StackOverflow或Google上找到类似的问题。

1 个答案:

答案 0 :(得分:4)

据推测,您想要的查询加入stockid

create table sum_trading_volume as
    select isd.stockid, isd.date, sum(asd.volume) as thirty_day_volume
    from important_stock_dates isd join
         all_stock_dates asd
         on isd.stockid = asd.stockid and
            asd.date < isd.date and asd.date >= isd.thirtydaysprior
    group by isd.stockid, isd.date;

如果这样有效,它可能会完成。