この簡略化されたバージョンに起因する問題があります: 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 を保存できません。何かヒントはありますか?