PROC SQL
не гарантирует тот же порядок в любой обстоятельство. В общем случае, если вы делаете простой выбор из одной таблицы, он, вероятно, вернется в том порядке, в котором данные уже были, в основном потому, что больше работать не нужно.
Однако PROC SQL
, если он решит, что является оптимальным для этого будет делать такие вещи, как расщепленные данные на куски и обрабатывать их по отдельности параллельно - не столько, сколько это РЕКОМЕНДУЕМЫХ возможно, но это будет иногда, тем не менее. Это часто случается с join
, в частности, поскольку это может быть сделано как хеш-соединение, в этом случае вы можете получить его в порядке одной таблицы или в обоих случаях, либо в декартовом продукте, либо в нескольких других вариантах.
В частности, в вашем объединении выше оптимизатор SQL может выбрать его как декартово произведение, как хеш-соединение, как объединение индексов или несколько других методов. Каждый из них, вероятно, приведет к другому результату. Даже в этом случае возможно, что если соединение выполняется с несколькими потоками, потоки могут быть сбалансированы по-разному в зависимости от условий сервера/компьютера, на котором он выполняется в то время (т. Е. Если один процессор находится под большей нагрузкой из других процессов, он может получить меньше/больше данных).
Таким образом, вы никогда не должны полагаться на это, возвращая данные по порядку - всегда просите, чтобы он был возвращен по порядку.
Это также почему функция 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'. –