【问题标题】:Can't use LAG function in Proc SQL in SAS无法在 SAS 的 Proc SQL 中使用 LAG 函数
【发布时间】:2017-10-18 14:21:51
【问题描述】:

我在 SAS 程序中创建了 proc sql 查询,但需要使用 LAG 函数,它告诉我它不能在 proc sql 中使用,只能在数据步骤中使用。 代码:

proc sql;
CREATE TABLE agg_table AS
SELECT USER, MAX(TIME) AS LAST_TIME, SUM(BONUS) AS BONUS_SUM, LAG(EXPDT) AS EXPDT_LAG FROM WORK.MY_DATA GROUP BY USER_ID;

那么,我不知道如何将 proc sql 和 datastep 组合到一个查询中以获取一个表作为输出? 或者也许有更好的方法来解决整个问题? 谢谢

【问题讨论】:

  • 在基本 SAS 中,我认为您不能将 sumlag 组合在一个 SQL 查询/数据步骤中,除非您想写下一个相当复杂的代码,保留一组滞后的观察。如果MY_DATA 中没有可用于连接LAG(EXPDT) 的行号列,例如可以先在data step 中计算LAG(EXPDT),然后在proc sql 中计算聚合列。
  • 如果您需要有用的帮助来解决此问题,请包含示例输入数据和示例所需的输出数据。
  • 查看 PROC EXPAND 以及对时间序列数据进行统计。

标签: sas


【解决方案1】:

PROC SQL 没有与 datastep 相同的行概念。 SQL 可以按任何顺序处理行,不一定是顺序的,并且可以使用哈希表、并行处理或各种二叉树和类似方法来处理其查询;同一个查询可以用不同的方法处理。因此lag 在 SQL 中不可用,diff 或其他需要行数据的函数也不可用。

从您的问题中不清楚您到底在做什么,因此实际上不可能直接回答如何单独执行此操作;但是您可能能够在一个数据步中完全完成此操作,或者您可以组合一个数据步和一个 SQL 查询,或者两个数据步。您可以在先前的数据步或视图中执行lag,然后在 SQL 中执行其余操作;或者您可以使用 DoW 循环数据步来执行最大/总和元素。

【讨论】:

  • 感谢您提到 DoW 循环,我不知道这可以在数据步骤中完成。不错!
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多