18

我试图从一列中选择最大值,同时按另一个具有多个重复值的非唯一 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 函数的情况下添加其他列,以将名称和类型等列包含到输出表中,例如:

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

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

4

5 回答 5

23

你有一个问题。这是可能的解决方案之一:

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

于 2013-07-01T18:32:57.763 回答
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 添加到分组依据。请注意,这一切都取决于您的要求。

如果您希望在 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
于 2013-07-01T18:41:32.610 回答
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 
于 2013-07-01T18:31:25.433 回答
0

您不能只添加其他列而不将它们添加到GROUP BY或应用聚合函数。这样做的原因是,一个列的值在一个组内可能不同。例如,您可以有两行:

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

name列和的聚合组应该如何type

如果组内的名称和类型始终相同,只需将其添加到GROUP BY子句中:

SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent
FROM c
GROUP BY c.muke, c.name, c.type;
于 2013-07-01T18:32:36.200 回答
0

使用“有”子句

SELECT *
FROM c
GROUP BY c.mukey
HAVING c.comppct_r = Max(c.comppct_r);
于 2021-03-19T14:17:13.307 回答