PROC SQL返回的行的顺序

时间:2015-04-21 17:54:15

标签: sql sas proc-sql

如果没有sortgroup by语句,我想知道PROC SQL返回数据的顺序。总是一样吗?

例如,假设我这样做:

proc sql;
    create table cusips as
        select a.cusip as c1, b.cusip as c2
        from shrs a, shrs b;
quit;

它只是给我一个两个cusip变量的每个组合的列表。这些顺序是否与原始输入数据相同?它看起来像我的情况,但我想知道我是否可以确定这将永远是真的。

1 个答案:

答案 0 :(得分:2)

PROC SQL不保证任何情况下的订单相同。 一般情况下,如果您从单个表中进行简单的选择,它可能会按照数据已经存在的顺序返回,主要是因为它不需要做更多的工作这一点。

然而,PROC SQL如果它决定这样做是最佳的,那么会做一些事情,比如将数据拆分成块并且并行处理它们 - 而不是应该可能的那样多,但有时候它会。 join经常会发生这种情况,特别是因为它可以将其作为散列连接,在这种情况下,您可以在一个表的顺序或两者中获得它,或者是笛卡尔积,或者其他一些选项

特别是,在上面的连接中,SQL优化器可能会选择将其作为笛卡尔积,散列连接,索引连接或其他几种方法来实现。它们中的每一个都可能导致不同的结果。即使在此范围内,如果使用多个线程完成连接,也可能根据当时执行的服务器/计算机的条件(即,如果一个CPU处于不同状态)来平衡线程。来自其他进程的负载越多/越少,它可能会获得更少/更多的数据。

因此,你永远不应该依赖它按顺序返回数据 - 总是要求它按顺序返回。

这也是为什么不建议将monotonic()函数用于生产代码的原因(因为如果最终订单与原始订单不同,它可能并不总是返回预期值)。

如果您希望以原始订单恢复数据并且不知道原始订单或者不想指定完整订单,一个好的解决方法是使用datastep视图获取原始订单。 Datastep视图将按顺序处理数据。

data myview/view=myview;
  set mydata;
  _ordervar+1;
run;

proc sql;
  select * from myview
    order by _ordervar;
quit;