首页 > 解决方案 > 有没有比在 Proc SQL 中使用一对多连接更快的方法来生成所需的输出?

问题描述

我需要一个显示在滚动 24 小时窗口中工作的总小时数的输出。当前存储的数据是这样的,每行是每人一个小时的时段(例如 1 月 2 日上午 7 点至 8 点),他们在该小时内的工作量存储为“小时”。我需要创建的是另一个字段,它是每行最近 24 小时时段(含)的总和。因此,对于上面早上 7 点到 8 点的示例,我想要 24 行中“小时”的总和:1 月 1 日上午 8 点到 9 点,1 月 1 日上午 9 点到 10 点……1 月 2 日上午 6 点到 7 点,1 月 2 日上午 7 点到 8 点。

每小时清洗一次并重复一次。

有 6000 人,我们有 6 个月的数据,这意味着该表有 6000 * 183 天 * 24 小时 = 26.3m 行。

我目前正在使用下面的代码完成此操作,该代码很容易在 50 人的样本上工作,但当我在整个桌子上尝试时会停止,这有点可以理解。

有没有人有任何其他想法?所有日期/时间变量都是日期时间格式。

proc sql;
create table want as
 select x.*
 , case when Hours_Wrkd_In_Window > 16 then 1 else 0 end as Correct 
 from (
  select a.ID
  , a.Start_DTTM
  , a.End_DTTM
  , sum(b.hours) as Hours_Wrkd_In_Window
  from have a
   left join have b
   on a.ID = b.ID
   and b.start_dttm > a.start_dttm - (24 * 60 * 60)
   and b.start_dttm <= a.start_dttm
  where datepart(a.Start_dttm) >= &report_start_date.
  and datepart(a.Start_dttm) < &report_end_date.
  group by ID
  , a.Start_DTTM
  , a.End_DTTM  
) x
order by x.ID
, x.Start_DTTM
;quit;

标签: joinoptimizationsasone-to-many

解决方案


如果还没有,则连接表中正在访问的列上的复合索引 - id+ start_dttm+ hours- 将很有用。

Usingmsglevel=i将打印一些有关如何执行查询的诊断信息。它可能会给出一些额外的提示。


推荐阅读