我必须将一些SQL从PostgreSQL迁移到SQL Server(2005+).在PostgreSQL我有:
select count(id) as count, date
from table
group by date
order by count
limit 10 offset 25
Run Code Online (Sandbox Code Playgroud)
现在我需要相同的SQL,但对于SQL Server.我是这样做的,但得到错误:Invalid column name 'count'.如何解决?
select * from (
select row_number() over (order by count) as row, count(id) as count, date
from table
group by date
) a where a.row >= 25 and a.row < 35
Run Code Online (Sandbox Code Playgroud)
您不能在同一范围内按名称引用别名,但结尾 除外ORDER BY(它是同一范围内窗口函数内的无效引用).
要获得完全相同的结果,可能需要将其扩展为(为了清晰起见,嵌套范围):
SELECT c, d FROM
(
SELECT c, d, ROW_NUMBER() OVER (ORDER BY c) AS row FROM
(
SELECT d = [date], c = COUNT(id) FROM dbo.table GROUP BY [date]
) AS x
) AS y WHERE row >= 25 AND row < 35;
Run Code Online (Sandbox Code Playgroud)
根据mohan的回答,这可以缩短一点.
SELECT c, d FROM
(
SELECT COUNT(id), [date], ROW_NUMBER() OVER (ORDER BY COUNT(id))
FROM dbo.table GROUP BY [date]
) AS y(c, d, row)
WHERE row >= 25 AND row < 35;
Run Code Online (Sandbox Code Playgroud)
在SQL Server 2012中,OFFSET/FETCH更容易- 更接近您习惯的语法,但实际上使用的是ANSI兼容的语法而不是专有的巫术.
SELECT c = COUNT(id), d = [date]
FROM dbo.table GROUP BY [date]
ORDER BY COUNT(id)
OFFSET 25 ROWS FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)
我在2010年写了关于这个功能的博客(那里也有很多好的评论),并且应该花一些时间做一些严肃的性能测试.
我同意@ajon - 我希望你的真实表格,列和查询不会滥用这样的保留字.