2013-07-01 53 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