SQL - 过滤后的顺序

时间:2010-10-06 15:12:18

标签: sql sql-server sql-server-2005 tsql sql-order-by

如何订购数据,然后在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 个答案:

答案 0 :(得分:6)

使用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

编辑:

您在@Start和@End之间的搜索是在ROW_NUMBER日期生成的序列上。 Rank与此序列无关。排名(假设它是表中的列)将被忽略,因为您的序列在日期。你不需要对它进行排序。

如果“rank”实际上是“RowNum”,那么你仍然不需要“内部”排序,因为它是一个设置操作。不过你最需要的就是它。

如果排名是日期的次要排序,请使用此:

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