今天在分组统计的时候pgsql报错 must appear in the GROUP BY clause or be used in an aggregate function
,在mysql里面是能够的,可是pgsql报错,我去stackoverflow查询了一下,发现有人遇到过和我同样的问题,这是pgsql一个常见的聚合问题,在SQL3标准之前,选择显示的字段必须出如今在 GROUP BY
中。下面我把问题描述一下:mysql
有一张表叫 makerar
,表中记录以下:
cname | wmname | avg
--------|--------|-----------------------
canada | zoro | 2.00
spain | luffy | 1.00
spain | usopp | 5.00sql
我想要查询每一个 cname
的最大 avg
,按照mysql的写法是app
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
在pgsql中报错函数
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;
意思是 wmname
字段必须在 GROUP BY
中出现或者被用于聚合函数spa
因而我按照错误提示,把 wmname
字段加在 GROUP BY
后面,即code
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
获得的结果是get
cname | wmname | avg |
---|---|---|
canada | zoro | 2.00 |
spain | luffy | 1.00 |
spain | usopp | 5.00 |
而我指望获得的结果是io
cname | wmname | avg |
---|---|---|
canada | zoro | 2.00 |
spain | usopp | 5.00 |
解决方案有两种,可是我只看懂了一种,因而把这一种记录一下table
大致思路是在子查询中完成聚合,而后关联包含你想显示字段的表(这里是makerar自身)获取字段(这里是wmname),因此sql就变成了下面这个样子function
SELECT t.cname, m.wmname, t.max FROM (SELECT cname, MAX(avg) AS max FROM makerar GROUP BY cname) t LEFT JOIN makerar m ON t.cname = m.cname AND t.max = m.avg;
参考连接