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'子句,否則不能依賴結果集中值的排序。 –