我有以下形式的T-SQL查詢:SQL服務器MAX和GROUP BY不能很好地一起玩
SELECT f.fizz_name, b.buzz_version, fu.foo_name
FROM fizz f
INNER JOIN buzz b
ON f.fizz_id = b.fizz_id
INNER JOIN foo fu
ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
當我運行此查詢我得到如下結果:
fizz_name buzz_version foo_name
====================================
Gamma 0.3.960 Test
Gamma 0.3.961 Test
Gamma 0.3.960 Test
Gamma 0.3.961 Test
Delta 0.3.2588 Test
Delta 0.3.2589 Test
Delta 0.3.2588 Test
Delta 0.3.2589 Test
Echo 2.2.38 Test
Echo 2.2.38 Test
的問題在於它包含了許多我不關心的條目。在現實中,我只關心每個fizz
實例的最大buzz_version
,換句話說:
fizz_name buzz_version foo_name
====================================
Gamma 0.3.961 Test
Delta 0.3.2589 Test
Echo 2.2.38 Test
...因爲「2.2.38」是Echo
最新/ lexiconographically-最高buzz_version
,和同爲其他的嘶嘶聲。
所以我想在演唱會上使用GROUP BY
與MAX
像這樣來獲取這些值:
SELECT f.fizz_name, MAX(b.buzz_version), fu.foo_name
FROM fizz f
INNER JOIN buzz b
ON f.fizz_id = b.fizz_id
INNER JOIN foo fu
ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
GROUP BY b.buzz_version
但是,這給了我一個錯誤:
Column 'fizz.fizz_name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我要去哪裏錯了,爲什麼?
您正按查詢中的聚合進行分組。您需要按標量列進行分組。在這種情況下,按f.fizz_name組,fu.foo_name –
假設您的版本號是字符串,如果您不小心數據,則max可能會導致您遇到問題。例如0.10.1由於字母順序排序而比0.2.1更小版本 –
感謝@SeanLange(+1) - 把它放在答案中,我會給它一個綠色檢查! – smeeb