Row_Number 函数中的 SQL Server 别名

Vij*_*STO -2 sql row-number sql-server-2012

select tmp.id, tmp.portfolio,
   ROW_NUMBER() OVER(order by tmp.id DESC) AS RowNum 
from 
  (select r.portfolio, r.id
   from research r 
   where r.created_by = 'Adam Cohen'
 ) as tmp 
WHERE RowNum BETWEEN 5 AND 10;
Run Code Online (Sandbox Code Playgroud)

我无法在 where 条件中引用 RowNum,因为它显示无效的列名“RowNum”。请帮助我使用正确的语法来获得结果。

编辑 - 更改要求

SELECT * FROM 
( 
     select id, portfolio, 
     CASE WHEN l.posted_on IS NULL 
          THEN CONVERT(VARCHAR(40),l.created_on,120) 
          ELSE CONVERT(VARCHAR(40),l.posted_on,120) 
     END AS sort_by, 
     ROW_NUMBER() OVER(order by sort_by DESC) AS RowNum 
     from research 
     where created_by = 'Adam Cohen' 
) x 
WHERE x.RowNum BETWEEN 5 AND 10 
Run Code Online (Sandbox Code Playgroud)

我试图包含Row_Number像上面这样的函数,但我得到了sort_by无效的列。

Stu*_*tLC 5

您需要将投影包装在派生表中,但您可以删除内部tmp表:

SELECT * FROM
(
    select id, portfolio,
       ROW_NUMBER() OVER(order by id DESC) AS RowNum 
    from 
       research
    where created_by = 'Adam Cohen'
) x
WHERE x.RowNum BETWEEN 5 AND 10
Run Code Online (Sandbox Code Playgroud)

编辑

请注意,如果您实际上不需要最终选择中的伪行号,那么自 Sql 2012 以来,在您的“数据页”场景中,您将能够使用OFFSET FETCHapply 而不需要ROW_NUMBER()任何派生表:

select id, portfolio
from research
where created_by = 'Adam Cohen'
order by id desc
offset 5 rows fetch next 6 rows only;
Run Code Online (Sandbox Code Playgroud)

编辑#2,重新要求

CASE WHEN l.posted_on IS NULL 
   THEN CONVERT(VARCHAR(40),l.created_on,120) 
   ELSE CONVERT(VARCHAR(40),l.posted_on,120) 
END AS sort_by
Run Code Online (Sandbox Code Playgroud)

可以更简洁地表示为

CONVERT(VARCHAR(40), COALESCE(posted_on, created_on)) AS AS sort_by
Run Code Online (Sandbox Code Playgroud)

但是,如果您仍然需要原始行号,您还可以ORDER BY在加窗函数 ( OVER) 中使用此投影,为了消除它,您将需要嵌套派生表。您仍然可以使用 SQL 2012OFFSET / FETCH NEXT进行分页,但是:

SELECT *,
       ROW_NUMBER() OVER(order by sort_by DESC) AS RowNum 
FROM
(
    SELECT id, portfolio, CONVERT(VARCHAR(40), COALESCE(posted_on, created_on)) AS sort_by
    from research 
    where created_by = 'Adam Cohen' 
) y
ORDER BY id DESC
OFFSET 5 ROWS FETCH NEXT 6 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)