如何通过分页计数?

mar*_*osh 1 sql-server

我必须将一些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)

Aar*_*and 5

您不能在同一范围内按名称引用别名,但结尾 除外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 - 我希望你的真实表格,列和查询不会滥用这样的保留字.