我正在进行查询,我需要使用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;
感谢您的帮助。
答案 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值的行,或者可能是前三个值),那么这是什么你可以这样做:
使用TOP 1 WITH TIES
(1
,因为它仅对最顶层的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;
使用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;