我有以下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