希望这对于 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/