今天在分組統計的時候pgsql報錯 must appear in the GROUP BY clause or be used in an aggregate function
,在mysql里面是可以的,但是pgsql報錯,我去stackoverflow查詢了一下,發現有人遇到過和我一樣的問題,這是pgsql一個常見的聚合問題,在SQL3標准以前,選擇顯示的字段必須出現在在 GROUP BY
中。下面我把問題描述一下:
有一張表叫 makerar
,表中記錄如下:
cname | wmname | avg |
---|---|---|
canada | zoro | 2.00 |
spain | luffy | 1.00 |
spain | usopp | 5.00 |
我想要查詢每個 cname
的最大 avg
,按照mysql的寫法是
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
中出現或者被用於聚合函數
於是我按照錯誤提示,把 wmname
字段加在 GROUP BY
后面,即
SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
得到的結果是
cname | wmname | avg |
---|---|---|
canada | zoro | 2.00 |
spain | luffy | 1.00 |
spain | usopp | 5.00 |
而我期望得到的結果是
cname | wmname | avg |
---|---|---|
canada | zoro | 2.00 |
spain | usopp | 5.00 |
解決方案有兩種,但是我只看懂了一種,於是把這一種記錄一下
大體思路是在子查詢中完成聚合,然后關聯包含你想顯示字段的表(這里是makerar自身)獲取字段(這里是wmname),所以sql就變成了下面這個樣子
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;
參考鏈接