Возвращать строки в процентах от максимального значения для столбца - PullRequest
3 голосов
/ 06 октября 2011

Использование полнотекстового поиска SQL Server 2005 Я хотел бы вернуть значения в% от максимального результата релевантности для этого поиска.

 SELECT 
 A.ActivityID,
 KEY_TBL.Rank as Relevance, 
 DENSE_RANK() OVER (ORDER BY  Rank DESC) as SearchRank
 FROM Activity A 
 INNER JOIN FREETEXTTABLE(vwActivitySearch, FTS,'My search expression') AS KEY_TBL ON A.ActivityID = KEY_TBL.[KEY]

возвращает:

    ActivityID  Relevance   SearchRank
    ----------- ----------- --------------------
    89378       242         1
    89406       242         1
    88083       236         2
    88214       236         2
    84007       197         3
    83434       197         3
    13017       172         4
    89247       164         5
    89346       164         5

Скореечем возвращать по рангу, я бы хотел вернуть значения, которые превышают 90% или некоторый произвольный процент максимальной релевантности, поэтому в этом примере

 WHERE Relevance>(242*0.9). 

Я уверен, что есть простой способчтобы достичь этого, но я не вижу этого.

Некоторые ограничения -

  • Запрос представляет собой выражение CTE в UDF.
  • Я мог бы легко выполнитьначальный запрос для получения @ MAXRelevance = SELECT MAX (Relevance) ... затем используйте Max (Relevance) в предложении WHERE, но полнотекстовый поиск не гарантирует возврат одинаковых абсолютных значений для результатов релевантности при повторных поисках.

Существующая функция:

 CREATE FUNCTION [dbo].[xxActivitySearch] (@SearchTerm varchar(255)='',@ResultDepth int)
 RETURNS @ReturnTable Table (ActivityID int,Relevance int,SearchRank int)
 AS
 BEGIN
 WITH T AS (
 SELECT 
   A.ActivityID,
   KEY_TBL.Rank as Relevance, 
   DENSE_RANK() OVER (ORDER BY  Rank DESC) as SearchRank
 FROM Activity A 
INNER JOIN FREETEXTTABLE(vwActivitySearch, FTS,@SearchTerm) AS KEY_TBL ON A.ActivityID=KEY_TBL.[KEY])
INSERT @ReturnTable SELECT * FROM T WHERE (SearchRank<=@ResultDepth)
RETURN
END 

1 Ответ

2 голосов
/ 09 октября 2011
WITH T AS
(
SELECT A.ActivityID,
       KEY_TBL.Rank                           as Relevance,
       DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank,
       MAX(KEY_TBL.Rank) OVER() AS MaxRelevance
FROM   Activity A
       INNER JOIN 
         FREETEXTTABLE(vwActivitySearch, FTS, 'My search expression') AS KEY_TBL
         ON A.ActivityID = KEY_TBL.[KEY]  

)
SELECT ActivityID,
       Relevance,
       SearchRank
FROM T
WHERE Relevance>(MaxRelevance*0.9)
...