【发布时间】:2020-01-23 21:39:18
【问题描述】:
我的工作场所实施了一个 Oracle Exadata 服务器来在我们的 SAS 安装之后运行。我正在使用 SQL 直通将我的 SAS 脚本转换为在此 Oracle 环境中运行。我似乎无法想出一个与我的 SAS“PROC TRANSPOSE”相同的结果
这是我的 SAS 过程
PROC TRANSPOSE DATA=WORK.ROW_LEVEL_DATA OUT=WORK.PIVOT_DATA (DROP= _NAME_ _LABEL_) PREFIX=ORDR;
BY GROUPKEY;
ID ORDR_NUM;
VAR STRING_VAL;
RUN;
我的数据已设置为每个 STRING_VAL 按顺序编号为 25。目前,SAS 将按 GROUPKEY 旋转并创建列 ORDR1、ORDR2、ORDR3 等,一直到 25。每个 STRING_VAL 都放置在适当的编号列。
这是我尝试使用直通 SQL 重新创建的结果。
GROUPKEY ORDR1 ORDR2 ORDR3
123456 AAAAA BBBBB CCCCC
654645 AAAAA
759876 BBBBB CCCCC
非常感谢任何帮助!
编辑:我使用 SAS PROC 处理了超过 1B 条记录,在 16 分钟内产生了 98.6M 转置记录。这是可以接受的时间量,但我很好奇是否有更好的方法使用直通 SQL。
【问题讨论】:
-
如果查询总是返回包含列
ORDR1到ORDR25的结果集,而不管任何GROUPKEY中是否实际上有25 个值,您是否满意?如果我遵循您的 SAS 代码,您将按ordr_num排序,但显示string_val,对吗?因此,您的样本恰好按字母顺序按string_val排序的事实是巧合(或按ordr_num排序的副作用)? -
是的,我会很高兴的。通常,查询将始终生成具有 25 个值的记录。我使用的数据集有时可能超过 50 个值。在我的数据准备过程中,我删除了 25 以上的任何内容,因为它会以指数方式增加整个 SAS 数据集的大小。此外,此数据集的目的是进行一般分析,因此删除的值的贡献不超过 0.001%。排序顺序很重要。我正在使用它来汇总记录以进行分析(数量等)