首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >必须出现在GROUP BY子句中或在聚合函数中使用

必须出现在GROUP BY子句中或在聚合函数中使用
EN

Stack Overflow用户
提问于 2013-10-26 09:50:26
回答 3查看 491.8K关注 0票数 368

我有一个表,看起来像这个调用者'makerar‘

 cname  | wmname |          avg           
--------+-------------+------------------------
 canada | zoro   |     2.0000000000000000
 spain  | luffy  | 1.00000000000000000000
 spain  | usopp  |     5.0000000000000000

我想为每个cname选择最大平均值。

SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;

但我会得到一个错误,

ERROR:  column "makerar.wmname" must appear in the GROUP BY clause or be used in an   aggregate function 
LINE 1: SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;

所以我这样做

SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname, wmname;

然而,这不会给出预期的结果,并且下面显示了不正确的输出。

 cname  | wmname |          max           
--------+--------+------------------------
 canada | zoro   |     2.0000000000000000
 spain  | luffy  | 1.00000000000000000000
 spain  | usopp  |     5.0000000000000000

实际结果应该是

 cname  | wmname |          max           
--------+--------+------------------------
 canada | zoro   |     2.0000000000000000
 spain  | usopp  |     5.0000000000000000

我该如何着手解决这个问题?

注:此表是根据上一操作创建的视图。

EN

回答 3

Stack Overflow用户

发布于 2015-11-20 23:51:39

group by selects中指定非分组和非聚合字段的问题在于,引擎无法知道在这种情况下应该返回哪个记录的字段。它是第一个吗?这是最后一次吗?通常没有与聚合结果自然对应的记录(minmax是例外)。

但是,有一个变通办法:让必填字段也聚合起来。在posgres中,这应该是可行的:

SELECT cname, (array_agg(wmname ORDER BY avg DESC))[1], MAX(avg)
FROM makerar GROUP BY cname;

请注意,这将创建一个包含所有wname的数组,按avg排序,并返回第一个元素( postgres中的数组从1开始)。

票数 49
EN

Stack Overflow用户

发布于 2017-01-31 05:52:21

这似乎也很有效。

SELECT *
FROM makerar m1
WHERE m1.avg = (SELECT MAX(avg)
                FROM makerar m2
                WHERE m1.cname = m2.cname
               )
票数 1
EN

Stack Overflow用户

发布于 2016-11-09 22:07:26

我最近在尝试使用case when进行计数时遇到了这个问题,我发现更改whichcount语句的顺序可以解决这个问题:

SELECT date(dateday) as pick_day,
COUNT(CASE WHEN (apples = 'TRUE' OR oranges 'TRUE') THEN fruit END)  AS fruit_counter

FROM pickings

GROUP BY 1

在后者中,我得到了苹果和橙子应该出现在聚合函数中的错误,而不是使用-

CASE WHEN ((apples = 'TRUE' OR oranges 'TRUE') THEN COUNT(*) END) END AS fruit_counter
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19601948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档