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;
来源
2015-04-21 19:06:34
Joe
SQL中的表和结果集(不同于SAS)表示*无序*集。除非您指定'by by'子句,否则不能依赖结果集中值的排序。 –