Sql server 如何基于计算列进行分页

Sql server 如何基于计算列进行分页,sql-server,pagination,calculated-columns,Sql Server,Pagination,Calculated Columns,我有一个问题可以归因于这个简化版本: 我在Sql Server 2008中有这样一个表(这是一个针对我的搜索的非规范化表): 我需要在这个表中搜索一个单词(如“蓝色”),根据单词出现的位置为结果分配一个等级,并通过CategoryId将等级相加对结果进行分组。 我能够做到这一点;当我尝试对结果分页时,问题就出现了。 这是我尝试过的存储过程(现在要搜索的单词已修复,但我知道如何将其作为参数;我还知道如何筛选ID以进行分页): 使用此sp,我得到以下结果: CategoryId | Ranking

我有一个问题可以归因于这个简化版本: 我在Sql Server 2008中有这样一个表(这是一个针对我的搜索的非规范化表):

我需要在这个表中搜索一个单词(如“蓝色”),根据单词出现的位置为结果分配一个等级,并通过CategoryId将等级相加对结果进行分组。 我能够做到这一点;当我尝试对结果分页时,问题就出现了。 这是我尝试过的存储过程(现在要搜索的单词已修复,但我知道如何将其作为参数;我还知道如何筛选ID以进行分页):

使用此sp,我得到以下结果:

CategoryId | Ranking | ID
0001       |   110   | 2
0002       |   100   | 1
问题是:要对结果进行分页,我需要ID(ROW_NUMBER)按排名的降序生成,而以这种方式,它是按CategoryId的顺序生成的。 如果我尝试以这种方式更改sp:

ROW_NUMBER() OVER(ORDER BY Ranking DESC) ID
我无法保存sp,因为排名不是列。
你有什么提示吗?

我想通过使用
公共表表达式
()我们可以解决这个问题

试试这个

;WITH cte AS
(
SELECT 

      [CategoryId],
      SUM(
        CASE WHEN (PATINDEX('%Blue%', Descr) > 0) THEN 100 ELSE 0 END +
        CASE WHEN (PATINDEX('%Blue%', ExtendedDescription) > 0) THEN 10 ELSE 0 END
        ) AS Ranking, 
      ROW_NUMBER() OVER(ORDER BY CategoryId DESC) ID
  FROM [dbo].[Data]
  where (Descr like '%Blue%' or
    ExtendedDescription like '%Blue%') 
GROUP BY CategoryId
)

SELECT ROW_NUMBER () OVER(ORDER BY Ranking DESC) AS r_no,
       Ranking,
       ID
FROM cte

非常感谢。正是我需要的!我的下一本手册将是关于Sql Server的,因为我不知道CTE。
ROW_NUMBER() OVER(ORDER BY Ranking DESC) ID
;WITH cte AS
(
SELECT 

      [CategoryId],
      SUM(
        CASE WHEN (PATINDEX('%Blue%', Descr) > 0) THEN 100 ELSE 0 END +
        CASE WHEN (PATINDEX('%Blue%', ExtendedDescription) > 0) THEN 10 ELSE 0 END
        ) AS Ranking, 
      ROW_NUMBER() OVER(ORDER BY CategoryId DESC) ID
  FROM [dbo].[Data]
  where (Descr like '%Blue%' or
    ExtendedDescription like '%Blue%') 
GROUP BY CategoryId
)

SELECT ROW_NUMBER () OVER(ORDER BY Ranking DESC) AS r_no,
       Ranking,
       ID
FROM cte