ms sql row_number()函数 - 不会让我在同一个语句中使用

时间:2012-03-07 15:15:23

标签: php sql sql-server where

我有以下sql语句:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE rownum >= 4";

“rownum”在我使用查询之外的名称时起作用(例如在foreach循环中),但是当它用作WHERE子句时,它永远不会起作用。

有什么想法吗?

由于

5 个答案:

答案 0 :(得分:5)

一种选择是

  • 将您的select语句包装到子选择
  • 在外部查询中使用rownum别名

SQL声明

select *
from   (
         select siteid
                , row_number() OVER (ORDER BY siteid) as rownum 
         FROM   nwsite 
       ) q
where  rownum >= 4

答案 1 :(得分:3)

因为在计算窗口函数row_number之前评估了where子句,所以不能在where子句中包含该列。

您可以像这样构建查询:

从(选择siteid,row_number()OVER(ORDER BY siteid)中选择siteid,rownum作为rownum FROM nwsite)nw WHERE rownum> = 4

在这种情况下,内部查询将完整计算,然后传递给可以对rownum列执行操作的外部查询。

答案 2 :(得分:1)

试试这样:

$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE row_number() >= 4";

您不能在同一WHERE子句的列部分中使用定义的别名。 WHERE子句还没有这些信息。

答案 3 :(得分:1)

使用公用表表达式:

with Result (field1, field2...,rn)
as
(select field1, field2..., rn=row_number() over (partition by field1 order by field 2)
from yourTable)
select * from result where rn<=3 ; -- top 3 in each group

答案 4 :(得分:1)

您还可以在RowNum中定义CROSS APPLY,以便您引用它。

select siteid, 
       RowNum
FROM nwsite 
CROSS APPLY (SELECT row_number() OVER (ORDER BY siteid)) CxA(rownum)
WHERE rownum >= 4