admin

使用GROUP BY选择多个(非聚合函数)列

sql

我试图从一个列中选择最大值,同时按具有多个重复值的另一个非唯一id列进行分组。原始数据库如下所示:

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函数的情况下添加其他列,以将诸如name和type之类的列包括到输出表中,例如:

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

但是它总是输出一个错误,说我需要在select语句中使用聚合函数。我应该怎么做呢?


阅读 366

收藏
2021-05-10

共1个答案

admin

您遇到了每组最多的问题。这是可能的解决方案之一:

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仅选择列上具有最大值的行

2021-05-10