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无效的列。
您需要将投影包装在派生表中,但您可以删除内部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)