【问题标题】:Return rows within a percentage of the maximum value for a column返回列的最大值百分比范围内的行
【发布时间】:2011-10-06 11:33:10
【问题描述】:

使用 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). 

我确信有一种简单的方法可以实现这一点,但我看不到。

一些限制 -

  • 查询是 UDF 中的 CTE 表达式。
  • 我可以轻松运行初始查询以获取 @MAXRelevance= SELECT MAX(Relevance)... 然后在 WHERE 子句中使用 Max(Relevance),但全文搜索不保证返回相同的绝对值的相关性结果重复搜索。

现有功能:

 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 

【问题讨论】:

  • 您不能添加第二个 CTE 来执行 SELECT ActivityID, Relevence, SearchRank FROM FirstCTE WHERE Relevence > (242*0.9) 并将其用作主查询的 CTE 吗?
  • 好点韦恩,这帮助我重新关注这一点。结果,我现在通过做一些非常相似的事情解决了眼前的问题。但是我仍然认为应该有一些方法可以在单个查询中实现这一点,而我只是错过了一个技巧。展望未来的项目,我怀疑新的 SQL Server Denali 'Analytical Functions' msdn.microsoft.com/en-us/library/hh213234(v=SQL.110).aspx 将对此类问题有很大帮助。
  • 我相信也有。我将继续做一些研究,因为我有兴趣解决类似的挑战。

标签: sql-server sql-server-2005 full-text-search


【解决方案1】:
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)

【讨论】:

  • 正是我想要的答案!
猜你喜欢
  • 2021-02-18
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2021-08-23
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多