Postgres:ERROR:列必须出现在GROUP BY子句中或用于聚合函数

时间:2017-02-17 04:43:52

标签: sql postgresql

我正在尝试构建一个选择组名的查询和销售额最高的CD的名称。架构看起来像

group(groupName,groupCode)

cd(cdTitle,numberSold,groupCode)

我构建了一个这样的查询:

SELECT mg.groupName, cd.cdTitle, MAX(cd.numberSold) as maxSold
FROM musicalGroup mg, cd cd
WHERE cd.groupCode = mg.groupCode
GROUP BY mg.groupCode

但我收到错误

  

错误:列“cd.cdtitle”必须出现在GROUP BY子句中或用于聚合函数

如果从SELECT语句中删除cd.cdtitle,我可以获得显示的正确结果

groupname... maxsold
"Test"... 80000
"Test2"... 81000

等等。我有什么方法可以从这个查询中检索CD名称吗?

1 个答案:

答案 0 :(得分:1)

一种方法是使用DENSE_RANK()来识别每个音乐组中的畅销书。请注意,我选择DENSE_RANK()而不是ROW_NUMBER(),因为前者将允许我们识别每个群体中多位艺术家,这些艺术家恰好与最高销量相关联。

WITH cte AS (
    SELECT mg.groupName,
           cd.cdTitle,
           cd.numberSold,
           DENSE_RANK() OVER (PARTITION BY cd.groupCode ORDER BY cd.numberSold DESC) dr
    FROM musicalGroup mg
    INNER JOIN cd cd
        ON cd.groupCode = mg.groupCode
)
SELECT t.groupName,
       t.cdTitle,
       t.numberSold AS maxSold
FROM cte t
WHERE t.dr = 1