我编写了以下 SQL 代码以在我的 SQL Server 上运行。

SELECT
   atd.DeviceID,
   ROW_NUMBER() over(order by atd.deviceid) as rownumber
FROM
   dbo.Devices atd
WHERE
  (rownumber between 11 and 20);

我得到以下输出:



如您所见,我想使用 ROW_NUMBER 仅获取查询通常会返回的行的子集。我以前从未使用过 ROW_NUMBER 函数。

我究竟做错了什么?

最佳答案

您不能直接使用列的别名,将其包装在派生表或 CTE 上:

SELECT *
FROM (  SELECT DeviceID,
        ROW_NUMBER() over(order by deviceid) as rownumber
        FROM dbo.Devices) atd
WHERE (rownumber between 11 and 20);

或者
;WITH CTE AS
(
    SELECT DeviceID,
    ROW_NUMBER() over(order by deviceid) as rownumber
    FROM dbo.Devices
)
SELECT *
FROM CTE
WHERE (rownumber between 11 and 20);

10-08 15:24