【问题标题】:How to pivot strings dynamically如何动态旋转字符串
【发布时间】: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。

【问题讨论】:

  • 如果查询总是返回包含列ORDR1ORDR25 的结果集,而不管任何GROUPKEY 中是否实际上有25 个值,您是否满意?如果我遵循您的 SAS 代码,您将按 ordr_num 排序,但显示 string_val,对吗?因此,您的样本恰好按字母顺序按string_val 排序的事实是巧合(或按ordr_num 排序的副作用)?
  • 是的,我会很高兴的。通常,查询将始终生成具有 25 个值的记录。我使用的数据集有时可能超过 50 个值。在我的数据准备过程中,我删除了 25 以上的任何内容,因为它会以指数方式增加整个 SAS 数据集的大小。此外,此数据集的目的是进行一般分析,因此删除的值的贡献不超过 0.001%。排序顺序很重要。我正在使用它来汇总记录以进行分析(数量等)

标签: oracle oracle11g pivot


【解决方案1】:

您可以在纯 SQL 中通过以下方式执行此操作:

  • 使用子查询为每个订单分配编号(如果它们是唯一的,则为 row_number,如果不是,则为dense_rank),按组分区
  • 透视此结果

这给出了:

create table t (
  groupkey integer,
  ordr_num varchar2(10)
);

insert into t values ( 123456, 'AAAAA' );
insert into t values ( 123456, 'BBBBB' );
insert into t values ( 123456, 'CCCCC' );
insert into t values ( 654645, 'AAAAA' );
insert into t values ( 759876, 'BBBBB' );
insert into t values ( 759876, 'CCCCC' );

with ranks as ( 
  select t.*, 
         dense_rank() over (
           partition by groupkey
           order by ordr_num
         ) rn
  from   t
)
  select * from ranks
  pivot (
    min ( ordr_num ) for rn in (
      1 ord1, 2 ord2, 3 ord3 -- etc. up to ord25
    )
  );

GROUPKEY    ORD1     ORD2      ORD3     
     123456 AAAAA    BBBBB     CCCCC     
     654645 AAAAA    <null>    <null>    
     759876 BBBBB    CCCCC     <null>  

【讨论】:

  • 谢谢。我已经给订单编号了。我需要创建一个包含转置结果的表。我会试一试并报告。
  • 方法效果很好。它在 8 分钟内生成了表格。我发现的唯一问题是我无法选择所需的字段。我从中提取这些变量的表不仅仅是groupkeyordr_numrn。我必须创建一个只有这些变量的单独表。可能是“我”的问题,因为我不熟悉枢轴功能。再次感谢。
  • 酷,谢谢。您应该能够在同一查询中获取其他列,但不确定这如何映射到您正在做的事情。请注意,子查询中不在pivot 子句中的列形成隐式group by。因此,每个 groupkey 最终可能会超过一行。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2016-05-23
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2010-10-21
  • 2018-07-14
相关资源
最近更新 更多