我有一个表,看起来像这个调用者'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
我该如何着手解决这个问题?
注:此表是根据上一操作创建的视图。
发布于 2015-11-20 23:51:39
在group by
selects中指定非分组和非聚合字段的问题在于,引擎无法知道在这种情况下应该返回哪个记录的字段。它是第一个吗?这是最后一次吗?通常没有与聚合结果自然对应的记录(min
和max
是例外)。
但是,有一个变通办法:让必填字段也聚合起来。在posgres中,这应该是可行的:
SELECT cname, (array_agg(wmname ORDER BY avg DESC))[1], MAX(avg)
FROM makerar GROUP BY cname;
请注意,这将创建一个包含所有wname的数组,按avg排序,并返回第一个元素( postgres中的数组从1开始)。
发布于 2017-01-31 05:52:21
这似乎也很有效。
SELECT *
FROM makerar m1
WHERE m1.avg = (SELECT MAX(avg)
FROM makerar m2
WHERE m1.cname = m2.cname
)
发布于 2016-11-09 22:07:26
我最近在尝试使用case when
进行计数时遇到了这个问题,我发现更改which
和count
语句的顺序可以解决这个问题:
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
https://stackoverflow.com/questions/19601948
复制相似问题