Sql server 我如何通过分页按计数订购?

Sql server 我如何通过分页按计数订购?,sql-server,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 现在,我需要相同的SQL,但用于SQL Server。我像下面这样做,但得到错误:列名“count”无效。如何解决 select * from ( select row_number() o

我必须将一些SQL从PostgreSQL迁移到SQL Server 2005+。在PostgreSQL上,我有:

select count(id) as count, date
from table 
group by date 
order by count 
limit 10 offset 25
现在,我需要相同的SQL,但用于SQL Server。我像下面这样做,但得到错误:列名“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

不能在同一范围内按名称引用别名,除非按结束顺序引用,否则它在同一范围内的窗口函数内是无效引用

为了获得完全相同的结果,可能需要将其扩展到嵌套范围以提高清晰度:

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;
我在那里也有很多好的评论,也许应该花些时间做一些认真的性能测试


我同意@ajon的观点-我希望您真正的表、列和查询不会像这样滥用保留字。

您不能在同一范围内按名称引用别名,除非按结束顺序引用别名,否则它在同一范围内的窗口函数内是无效引用

为了获得完全相同的结果,可能需要将其扩展到嵌套范围以提高清晰度:

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;
我在那里也有很多好的评论,也许应该花些时间做一些认真的性能测试


我同意@ajon的说法——我希望您真正的表、列和查询不会像这样滥用保留字。

我想这样就可以了

select * from (
   select row_number() over (order by id) as row, count(id) as count, date 
   from table 
   group by date
) a where a.row >= 25 and a.row < 35

另外,我不知道您使用的是哪一版本的SQL Server,但SQL Server 2012有一个新功能

我想这就可以了

select * from (
   select row_number() over (order by id) as row, count(id) as count, date 
   from table 
   group by date
) a where a.row >= 25 and a.row < 35
另外,我不知道您使用的是哪个版本的SQL Server,但SQL Server 2012有一个新功能,它可以工作

DECLARE @startrow int=0,@endrow int=0

;with CTE AS (

select row_number() over ( order by count(id)) as row,count(id) AS count, date
from table
group by date 
)
SELECT * FROM CTE 
WHERE  row between @startrow and @endrow
它起作用了

DECLARE @startrow int=0,@endrow int=0

;with CTE AS (

select row_number() over ( order by count(id)) as row,count(id) AS count, date
from table
group by date 
)
SELECT * FROM CTE 
WHERE  row between @startrow and @endrow

我不知道,但我会考虑使用保留字数作为别名。同样,我不使用sql server,所以我不知道这是否是问题所在。但不管怎样,这都是一种不好的做法。所以人们不必像我一样给出答案,你能在你的问题中加入SQL Server的版本吗?我不知道,但我会考虑使用保留字数作为别名。同样,我不使用sql server,所以我不知道这是否是问题所在。但不管怎样,这都是不好的做法。所以人们不必像我一样给出答案,你能在你的问题中加入SQL Server的版本吗?@marioosh,因为SQL Server按照标准正确地做了这件事,而不是提出这一无意义的限制。您可以从SQL Server 2012开始使用偏移/提取。我不知道您是否可以使用它,因为您不需要指定版本。另外,如果您不基于聚合进行分页,那么它会更简单。如果查询太难,你可以考虑索引视图。@ MiRooSH,因为SQL Server这样做是正确的,遵循标准,而不是提出这个限制性的废话。您可以从SQL Server 2012开始使用偏移/提取。我不知道您是否可以使用它,因为您不需要指定版本。另外,如果您不基于聚合进行分页,那么它会更简单。如果查询太难,可以考虑索引视图。