【问题标题】:SQL - Order after filteringSQL - 过滤后的顺序
【发布时间】:2010-10-06 15:12:18
【问题描述】:

如何对数据进行排序并然后在 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。

如何解决?

【问题讨论】:

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


    【解决方案1】:

    使用 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”实际上是“RowNum”,那么您仍然不需要“内部”排序,因为它是一个集合操作。不过,您需要在最外层使用它。

    如果 rank 是 Date 的次要排序,那么使用这个:

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

    【讨论】:

    • 我需要先按Rank排序,然后选择@Start和@End之间的记录。这是用于搜索的。
    猜你喜欢
    • 2017-04-25
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多