在SQL Server中使用Group-By的级别高于Max命令

时间:2012-05-19 18:02:58

标签: sql-server group-by max

我正在进行查询,我需要使用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;

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您在寻找HAVING吗?:

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

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

答案 1 :(得分:0)

在谈论“剥离”较低级别的结果时,您不清楚自己的原则是什么。如果您想根据某个过滤结果,那么a1ex07's answer似乎就要走了。

但是如果你的意思是根据返回的MAX值的排名过滤它们(即只显示最高MAX值的行,或者可能是前三个值),那么这是什么你可以这样做:

  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;