0

我正在做一个查询,我需要使用 SQL Server 中的 Max 命令去除一些较低级别的结果。那么我怎样才能做出更高级别的 Group By 声明?我知道我可以为此使用临时表。我期望高容量,并希望避免出于性能目的创建和破坏临时表。

SELECT k.Result_ID, k.Key_Name, max(k.Value_Percentage) as Percentage 
FROM Key_Word k
LEFT JOIN Phrase p 
    ON p.Result_ID = k.Result_ID 
    AND p.Key_Name = k.Key_Name 
    AND k.Phrase_Flag = 1
    AND  @fulltextsearch LIKE '%' + p.phrase + '%'
WHERE k.Key_Word IN 
    ('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
    AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
GROUP BY k.Result_ID, k.Key_Name
ORDER BY k.Result_ID ASC;

谢谢你的帮助。

4

2 回答 2

2

你在寻找有?:

SELECT k.Result_ID, k.Key_Name, max(k.Value_Percentage) as Percentage 
FROM Key_Word k
LEFT JOIN Phrase p 
ON p.Result_ID = k.Result_ID 
AND p.Key_Name = k.Key_Name 
AND k.Phrase_Flag = 1
AND  @fulltextsearch LIKE '%' + p.phrase + '%'
WHERE k.Key_Word IN 
('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
GROUP BY k.Result_ID, k.Key_Name
HAVING max(k.Value_Percentage) > 10

或者,如果您需要显示max(k.Value_Percentage)每个 Result_ID ,您可以使用WITH ROLLUP

于 2012-05-19T18:12:32.660 回答
0

在谈论“剥离”较低级别的结果时,您的想法不是很清楚。如果您的意思是根据某个过滤结果,那么a1ex07 的答案似乎是可行的方法。

但是,如果您的意思是根据返回的 MAX 值的排名过滤它们(即仅显示具有最高 MAX 值的行,或者可能具有前 3 个值的行),那么您可以执行以下操作:

  1. 使用TOP 1 WITH TIES1因为它只对最上面的 MAX 可靠地工作):

    SELECT *
    FROM (
      SELECT TOP 1 WITH TIES
        k.Result_ID, k.Key_Name, MAX(k.Value_Percentage) as Percentage 
      FROM Key_Word k
      LEFT JOIN Phrase p 
          ON p.Result_ID = k.Result_ID 
          AND p.Key_Name = k.Key_Name 
          AND k.Phrase_Flag = 1
          AND  @fulltextsearch LIKE '%' + p.phrase + '%'
      WHERE k.Key_Word IN 
          ('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
          AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
      GROUP BY k.Result_ID, k.Key_Name
      ORDER BY MAX(k.Value_Percentage) DESC
    ) s
    ORDER BY Result_ID ASC;
    
  2. 使用DENSE_RANK()函数(需要 SQL Server 2005 或更高版本):

    SELECT *
    FROM (
      SELECT DENSE_RANK() OVER (PARTITION BY MAX(k.Value_Percentage)) AS ranking
        k.Result_ID, k.Key_Name, MAX(k.Value_Percentage) as Percentage 
      FROM Key_Word k
      LEFT JOIN Phrase p 
          ON p.Result_ID = k.Result_ID 
          AND p.Key_Name = k.Key_Name 
          AND k.Phrase_Flag = 1
          AND  @fulltextsearch LIKE '%' + p.phrase + '%'
      WHERE k.Key_Word IN 
          ('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
          AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
      GROUP BY k.Result_ID, k.Key_Name
    ) s
    WHERE ranking <= n
    ORDER BY Result_ID ASC;
    
于 2012-05-20T12:33:37.823 回答