sql - 在 where 子句中使用排名函数派生列 (SQL Server 2008)

标签 sql sql-server sql-server-2008

希望这对于 SQL 忍者来说是微不足道的...一直在尝试让以下查询正常工作:

这适用于 SQL Server 2008

SELECT 
    ROW_NUMBER() OVER (ORDER BY Date_Time DESC) AS RowNumber, *
FROM
    (SELECT 
         T.A_ID, T.User_Name, T.Date_Time, T.Value,
         U.ID, U.Name, U.Field1, U.Field2,
         COUNT(U.ID) OVER () AS TotalRows
     FROM 
        TeeTable as T 
    INNER JOIN 
        YouTable AS U ON T.U_ID = U.ID
    WHERE 
        T.Value BETWEEN 222 AND 225) Filtered
WHERE 
    RowNumber BETWEEN 1 AND 5

这些值在某种程度上是为了给出特定示例而设计的,但查询的精神被完全保留。我从这个语句中得到的错误是:

Invalid column name 'RowNumber'.

如果我删除最后的 WHERE 子句(RowNumber BETWEEN ...),它将返回预期的结果集(A_ID、User_Name、Date_Time 等...),其中 RowNumber 作为所述结果中的列(具有有意义的值)。但我无法在 WHERE 子句中与它进行比较。我显然做了一些愚蠢的事情,但这达到了我的 SQL 限制!

我也尝试过将其重新安排为 CTE(使用过滤 AS ...),但最终结果是相同的,看来这只是我已经在做的事情的一个糖。

想法?如何根据 RowNumber 派生列进行筛选?

最佳答案

您必须将 WHERE 运算符移至创建 RowNumber 列的项目列表上方。使用派生表或 CTE:

SELECT * 
  FROM (
   SELECT *, ROW_NUMBER() OVER (...) as RowNumber
   FROM ...) As ...
 WHERE RowNumber = ...

等效的 CTE 为:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (...) as RowNumber
       FROM ...)
SELECT * FROM cte 
WHERE RowNumber = ...   

关于sql - 在 where 子句中使用排名函数派生列 (SQL Server 2008),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479831/

相关文章:

sql-server - 带有 Excel 文件的 OPENROWSET

sql-server - MONTHS_BETWEEN 函数无法识别

python - 查询大型 SQL Server 表时,pymssql/pyodbc 性能 (cursor.execute) 非常慢

sql-server - 无法在 SQL Server 2019 中使用 Java Double.MIN_VALUE 4.9E-324 作为浮点文字

mysql - 需要对我的 SQL 查询进行一些修改

PHP 错误跟踪器 : storing attached files

sql-server - SQL Server 中的 CAST/CONVERT 空字符串为 INT

数据库组织Oracle

mysql - REGEXP 性能(与 "LIKE"和 "="比较)

java - 如何使用mybatis 3传递动态字段和值