Предложение Order by изменяет мой результирующий набор

#sql #sql-server #sql-order-by

#sql #sql-сервер #sql-order-by

Вопрос:

Я знаю, почему это происходит, но я хочу найти способ обойти это, если это возможно.

Например, у меня есть 4 строки в моей базе данных, и у каждой есть дата-время (которые все разные). Что я хочу сделать, так это получить последние 2 строки, но использовать порядок возрастания, чтобы самый старый находился в верхней части результирующего набора.

В настоящее время я использую

 SELECT TOP 2 *
FROM mytable
WHERE someid = @something
ORDER BY added DESC
  

Это дает мне правильные строки, но в неправильном порядке. Если я изменю DESC на ASC, он получит правильный порядок, но более старые две из четырех строк. Все это имеет смысл для меня, но есть ли способ обойти это?

РЕДАКТИРОВАТЬ: решается с помощью ответа Эллиота ниже. Однако синтаксис не будет работать без установки псевдонима для производной таблицы. Вот результат

 SELECT * FROM 
(SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC) AS tbl
ORDER BY tbl.added ASC
  

Ответ №1:

Я бы подумал, что одним из решений с использованием грубой силы будет:

 SELECT *
FROM (SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC)
ORDER BY added
  

Комментарии:

1. Я получаю синтаксическую ошибку в конце предложения ORDER BY Неправильный синтаксис рядом с ключевым словом ‘ORDER’. Нужно ли мне предложение WHERE для использования order by?

2. Неважно, исправил это. Я добавил «КАК tbl» в конец заключенного в квадратные скобки отчета select, а затем УПОРЯДОЧИТЬ ПО tbl.добавлено

Ответ №2:

Это позволит использовать «top 2 для чего-то» с добавлением РАЗДЕЛА BY к предложению OVER

 SELECT *
FROM
  (
  SELECT *, ROW_NUMBER() OVER (ORDER BY added DESC) as rn
  FROM mytable
  WHERE someid = @something
  ) foo
WHERE rn <= 2
ORDER BY added
  

Обратите внимание, что для производной таблицы требуется псевдоним

Комментарии:

1. Каковы преимущества этого метода по сравнению с приведенным выше методом Эллиота Нельсона?

2. @James Hay: честно говоря, ничего, кроме расширяемого для запросов типа «top n на группу» или более сложной сортировки.

3. Ну, это работает достаточно хорошо, поэтому поддерживает вас. Но я думаю, что для краткости я пойду с приведенным выше.