0

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

ItemId | CategoryId | Descr       | ExtendedDescription
0001   |          1 | Mouse X     | Blue mouse
0002   |          1 | Blue Pen    | Beautiful ....
0003   |          2 | Blue Pencil | Pencil with ...
0004   |          2 | Eraser      | Eraser with ....

我需要在此表中搜索一个单词(如“蓝色”),根据单词出现的位置为结果分配一个排名,并按 CategoryId 对结果进行分组,并对排名求和。我能够做到这一点;当我尝试对结果进行分页时出现问题。这是我尝试过的存储过程(现在要搜索的词是固定的,但我知道如何将其作为参数;我也知道如何过滤 ID 以进行分页):

CREATE PROCEDURE [dbo].[spSearch]

AS
BEGIN

SET NOCOUNT ON;

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
ORDER BY Ranking DESC
END

有了这个 sp,我得到以下结果:

CategoryId | Ranking | ID
0001       |   110   | 2
0002       |   100   | 1

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

ROW_NUMBER() OVER(ORDER BY Ranking DESC) ID

我无法保存 sp,因为 Ranking 不是一列。你有什么提示吗?

4

1 回答 1

1

我认为通过使用Common Table expressionCTE)我们可以解决这个问题

尝试这个

;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
于 2013-06-19T09:39:27.280 回答