join - 有没有比在 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;
解决方案
如果还没有,则连接表中正在访问的列上的复合索引 - id
+ start_dttm
+ hours
- 将很有用。
Usingmsglevel=i
将打印一些有关如何执行查询的诊断信息。它可能会给出一些额外的提示。
推荐阅读
- r - 向列添加小数位
- javascript - 在 http 代理中替换请求包
- c++ - 尝试运行一个简单的程序来测试模板函数,但总是导致找不到函数匹配错误
- javascript - 尝试返回布尔值而不是接收未定义
- python - 连接的数据框不按列对齐
- python - 将 Pipeline RDD 转换为 Spark 数据帧
- python - 在鼠标按下而不是释放时使用 pynput + pyperclip 复制数据
- html - 工具提示隐藏在表格行后面
- python - 在 txt 文件末尾取消 /n
- python - 我正在尝试访问 .json url 中的某个元素,但我一直遇到错误:TypeError: string indices must be integers