我有以下sql语句:
$sql = "select siteid, row_number() OVER (ORDER BY siteid) as rownum FROM nwsite WHERE rownum >= 4";
“rownum”在我使用查询之外的名称时起作用(例如在foreach循环中),但是当它用作WHERE子句时,它永远不会起作用。
有什么想法吗?
由于
答案 0 :(得分:5)
一种选择是
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