PROC SQL返回的行的顺序

PROC SQL返回的行的顺序,sql,sas,proc-sql,Sql,Sas,Proc Sql,我想知道如果没有sort或groupby语句,procsql返回数据的顺序。总是一样吗 例如,假设我这样做: proc sql; create table cusips as select a.cusip as c1, b.cusip as c2 from shrs a, shrs b; quit; 这给了我一个两个cusip变量组合的列表。这些数据的顺序是否与原始输入数据中的顺序相同?在我的情况下似乎是这样,但我想知道我是否能确保这始终是真的。PROC

我想知道如果没有
sort
groupby
语句,procsql返回数据的顺序。总是一样吗

例如,假设我这样做:

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

这给了我一个两个cusip变量组合的列表。这些数据的顺序是否与原始输入数据中的顺序相同?在我的情况下似乎是这样,但我想知道我是否能确保这始终是真的。

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

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

特别是,在上面的连接中,SQL优化器可能会选择将其作为笛卡尔积、哈希连接、索引连接或其他几种方法。它们中的每一个都可能导致不同的结果。即使在这种情况下,如果连接是由多个线程完成的,那么线程的平衡也可能会有所不同,这取决于当时执行连接的服务器/计算机的条件(即,如果一个CPU承受来自其他进程的更多/更少的负载,它可能会获得更少/更多的数据)

因此,您永远不应该依赖它按顺序返回数据—始终要求按顺序返回数据

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

proc sql;
  select * from myview
    order by _ordervar;
quit;
这也是为什么不建议生产代码使用
monotonic()
函数的原因(因为如果最终订单与原始订单不同,它可能并不总是返回预期值)

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

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

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

SQL中的表和结果集(与SAS不同)表示无序集。除非指定了一个
order by
子句,否则不能依赖结果集中值的顺序。