2013-07-01 55 views
13

我想從一列中選擇最大值,而由具有多個重複值的另一個非唯一ID列進行分組。原始數據庫看起來類似:使用GROUP BY選擇多個(非聚合函數)列

mukey | comppct_r | name | type 
65789 | 20  | a | 7n 
65789 | 15  | b | 8m 
65789 | 1   | c | 1o 
65790 | 10  | a | 7n 
65790 | 26  | b | 8m 
65790 | 5   | c | 1o 
... 

這只是正常使用:

SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent 
FROM c 
GROUP BY c.mukey; 

它返回一個表,如:

mukey | ComponentPercent 
65789 | 20 
65790 | 26 
65791 | 50 
65792 | 90 

我希望能夠添加其他列在不影響GROUP BY功能的情況下,在名稱和類型等列中加入如下輸出表:

mukey | comppct_r | name | type 
65789 | 20  | a | 7n 
65790 | 26  | b | 8m 
65791 | 50  | c | 7n 
65792 | 90  | d | 7n 

但它總是輸出錯誤,說我需要在select語句中使用聚合函數。我應該如何去做這件事?

+1

什麼是您預期的結果? –

+0

補充說,對於操作,謝謝 – Dylansq

回答

17

你有自己問題。這是可能的解決方案之一:

select c.mukey, c.comppct_r, c.name, c.type 
from c yt 
inner join(
    select c.mukey, max(c.comppct_r) comppct_r 
    from c 
    group by c.mukey 
) ss on c.mukey = ss.mukey and c.comppct_r= ss.comppct_r 

另一種可能的方法,相同的輸出:

select c1.* 
from c c1 
left outer join c c2 
on (c1.mukey = c2.mukey and c1.comppct_r < c2.comppct_r) 
where c2.mukey is null; 

有關於這一主題的綜合性和解釋性的答案在這裏:SQL Select only rows with Max Value on a Column

+0

「ss上c.mukey = ss.mukey和c.comppct_r = ss.comppct_r」中的'ss'是什麼意思? – Dylansq

+1

'ss'是我給派生表的名稱(在括號之間聲明的結構) –

+0

第二種解決方案的工作原理是什麼?在我的情況下,它什麼都不做 - 只顯示所有行。看來這種方法必須使用group by ... –

0

嘗試使用虛擬表如下:

SELECT vt.*,c.name FROM(
SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent 
FROM c 
GROUP BY c.muke; 
) as VT, c 
WHERE VT.mukey = c.mukey 
0

你不能只是添加更多的列,而不將其添加到GROUP BY或應用聚合函數。原因是,一個組內的列值可能不同。例如,你可以有兩行:

mukey | comppct_r | name | type 
65789 | 20  | a | 7n 
65789 | 20  | b | 9f 

彙總組應該如何看起來像在列nametype

如果名稱和類型總是一組中的一樣,只是將它添加到GROUP BY條款:

SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent 
FROM c 
GROUP BY c.muke, c.name, c.type; 
1

任何非聚合列應該在Group By子句中出現..爲什麼?

    t1 
x1   y1   z1 
1   2    5 
2   2    7 

現在你正在嘗試寫這樣的查詢:

select x1,y1,max(z1) from t1 group by y1; 

現在,這個查詢將導致只有一排,但應該是什麼X1的價值?這基本上是一個未定義的行爲。爲了解決這個問題,SQL會錯誤地輸出這個查詢。

現在,您可以選擇x1的聚合函數,也可以將x1添加到group by。請注意,這一切都取決於您的要求。

如果您希望所有具有z1分組的聚合行(由y1組成),則可以使用SubQ方法。

Select x1,y1,(select max(z1) from t1 where tt.y1=y1 group by y1) 
from t1 tt; 

這將產生類似的結果:

    t1 
x1   y1   max(z1) 
1   2    7 
2   2    7