SQL - порядок после фильтрации - PullRequest
2 голосов
/ 06 октября 2010

Как заказать данные и затем отфильтровать их в TSQL (SQL Server)?

Я пробовал что-то вроде этого:

SELECT [Job].*, 
    ROW_NUMBER() OVER (ORDER BY [Job].[Date]) AS RowNum 
FROM [Job] 
ORDER BY Rank 
WHERE RowNum >= @Start AND RowNum < @End

не работает. Я также попытался использовать подзапрос, который выдает:

Предложение ORDER BY недопустимо в представления, встроенные функции, производные таблицы, подзапросы и общая таблица выражений, если TOP или FOR XML не также указано.

Я не хочу использовать TOP или FOR XML.

Как это решить?

1 Ответ

6 голосов
/ 06 октября 2010

Используйте CTE.Обратите внимание, что "внутренний" ORDER BY в этом случае подразумевается ROW_NUMBER / OVER.

;WITH cBase AS
(
SELECT
    [Job].*, 
    ROW_NUMBER() OVER (ORDER BY [Job].[Date]) AS RowNum 
FROM
    [Job] 
)
SELECT
    *
FROM
    cBase
WHERE
    RowNum >= @Start AND RowNum < @End
--ORDER BY
    --output order

Edit:

Ваш поиск между @Start и @End выполняется в последовательности, сгенерированнойROW_NUMBER на дату.Ранг не имеет отношения к этой последовательности.Ранг (при условии, что это столбец в таблице) будет игнорироваться, потому что ваша последовательность на Date.Вам не нужно сортировать по нему.

Если «rank» на самом деле «RowNum», то вам все равно не нужна «внутренняя» сортировка, потому что это операция над множествами.Вам это понадобится для самой внешней сортировки.

Если rank является вторичной сортировкой на Date, используйте это:

ROW_NUMBER() OVER (ORDER BY [Job].[Date], [Job].[Rank]) AS RowNum
...