昨天写postgresql代码的时候遇到一个棘手的问题,题目是要计算在各个城市使用次数最多的手机型号。此时只有一个表,叫做usage,里面存储了每一次用户使用服务时的手机型号以及使用的城市,即,usage里有phone_id和城市的zip_code。
此时要统计每个城市使用次数最多的手机型号,自然而然地想到先进行一次GROUP BY,于是写出如下代码:
SELECT u.zip_code,u.phone_id,COUNT(*) number
FROM usage u
GROUP BY u.zip_code,u.phone_id;
此时发现出来的结果是:
zip_code | phone_id | number
----------+----------+--------
888 | 22222 | 2
444 | 11111 | 2
444 | 44444 | 1
888 | 33333 | 3
444 | 99999 | 1
222 | 44444 | 4
888 | 11111 | 8
444 | 00000 | 1
444 | 22222 | 6
444 | 55555 | 2
(10 行记录)
这个时候发现只分一次组是不够的,这样只统计出了在某个城市使用某个手机型号的次数,但是题目要求要算出每个城市使用次数最多的手机型号,所以需要二次分组。于是,我尝试着写出了如下代码:
SELECT pc.zip_code,pc.phone_id,MAX(pc.number)
FROM (
SELECT u.zip_code,u.phone_id,COUNT(*) number
FROM usage u
GROUP BY u.zip_code,u.phone_id
)pc
GROUP BY pc.zip_code;
这个时候问题来了,报错了:
错误: 字段 "pc.phone_id" 必须出现在 GROUP BY 子句中或者在聚合函数中使用
第1行SELECT pc.zip_code,pc.phone_id,MAX(pc.number)<