ms-sql row_number()函数-won';不要让我在同一句话中使用


ms sql row_number() function - won't let me use within the same statement

我有以下sql语句:

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

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

有什么想法吗?

感谢

一个选项是

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

SQL语句

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

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

您可以这样构建查询:

选择siteid,rownum from(select siteid,row _number()OVER(ORDER BY siteid)as rownum from nwsite)nw WHERE rownum>=4

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

这样试试:

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

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

您还可以在CROSS APPLY中定义RowNum,这将允许您引用它。

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

使用通用表表达式:

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