如何订购数据,然后在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。
如何解决这个问题?
答案 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