2014-09-24 2 views
-1

В myTable есть дата и том, и я хочу рассчитать средний объем последних 5 дней трейдинга - не только для наивысшей даты - но для любых заданных @myDate. это работает отлично:SQL Server, заказывающий Top

select AVG(volume) 
from 
    (select Top (5) 
     volume, date 
    from 
     myTable 
    where 
     data <= @myDate 
    order by 
     date desc) t 

Я проверил это несколько раз и подвыборка я всегда выводит последние 5 записей перед данной @myDate.

НО Я НЕ ТАКОЙ КОНФИДЕНЦИАЛ, возможно, это работает случайно из-за моих указателей.

Вот мой вопрос:

  • если SQL Server первым делает order by date desc и ТОГДА выбирает Top (5) тогда он всегда будет работать нормально, в этом случае я мог бы опереться на результаты
  • Но если SQL Sever сначала выбирает Top (5), а THEN делает order by date desc, тогда я не мог положиться на результат - мои тестовые ящики могли бы работать хорошо случайно.

SQL Server всегда сначала вычисляет order by и THEN рассчитывает Top(5)?

Могу ли я полагаться на это?

+4

[TOP] (http://msdn.microsoft.com/en-gb/library/ms189463.aspx): «Когда« TOP »используется в сочетании с предложением« ORDER BY », результирующий набор ограничен к первому N числу ** упорядоченных ** строк "(мой акцент) –

+0

Он всегда делает заказ ТОГДА топ 5 –

+0

большое спасибо Дэмиен и Джеффри, это важно знать! Я не могу поверить в то, что меня обманывают здесь - просят самого достойного, хотя оценка была отрицательно оценена. –

ответ

2

Да. Если вы явно сортируете запрос с order by, то набор результатов будет отсортирован, тогда будут возвращены первые 5 записей (в этом примере).

Если вы явно не сортируете запрос, порядок сортировки никогда не будет гарантирован.