我有一个可归因于这个简化版本的问题:我在 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 不是一列。你有什么提示吗?