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

Dyl*_*nsq 15 sql ms-access greatest-n-per-group

我试图从一列中选择最大值,同时按另一个具有多个重复值的非唯一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
...
Run Code Online (Sandbox Code Playgroud)

这适用于:

SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent
FROM c
GROUP BY c.mukey;
Run Code Online (Sandbox Code Playgroud)

返回一个表格如下:

mukey    | ComponentPercent
65789    | 20
65790    | 26
65791    | 50
65792    | 90
Run Code Online (Sandbox Code Playgroud)

我希望能够在不影响GROUP BY功能的情况下添加其他列,在输出表中包含名称和类型等列,如:

mukey    | comppct_r | name | type
65789    | 20        | a    | 7n
65790    | 26        | b    | 8m
65791    | 50        | c    | 7n
65792    | 90        | d    | 7n
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*iro 21

你有自己问题.这是可能的解决方案之一:

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
Run Code Online (Sandbox Code Playgroud)

另一种可能的方法,相同的输出

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;
Run Code Online (Sandbox Code Playgroud)

这里有关于该主题的全面和解释性答案:SQL仅选择列上具有最大值的行