2012-05-19 37 views
0

我正在做一個查詢,我需要使用SQL Server中的Max命令去掉一些較低級別的結果。那麼我怎樣才能製作更高級別的Group By聲明?我知道我可以爲此使用臨時表。我期望高音量,並且希望避免創建和銷燬用於性能目的的臨時表。在比SQL服務器中的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

你是否在尋找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 

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

0

不是很清楚你有什麼原理當談論「剝離」較低層次的結果時,請介意。如果您的意思是根據某個篩選結果,那麼a1ex07's answer似乎就是要走的路。

但是,如果你的意思是根據排名返回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;