2017-02-17 62 views
0

我试图构造一个查询,选择一个组名和具有最高销售额的CD的名称。该模式看起来像Postgres:错误:列必须出现在GROUP BY子句中或用于聚合函数中

组(组名,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 

但我收到错误

ERROR: column "cd.cdtitle" must appear in the GROUP BY clause or be used in an aggregate function

如果我从SELE中删除cd.cdtitle CT声明我能够得到正确的结果显示

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

等等。有没有办法让我也从这个查询中检索CD名称?

回答

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 
+0

啊,我很抱歉。复制并粘贴查询时发生错误。这个问题源于我试图打印cd.cdTitle,而不是将代码和名称分组。我编辑了我的查询来反映这一点。 – JCDJulian

+0

我用我认为最有意义的方式更新了我的答案。 –

+0

嗯。这似乎很奇怪。它列出了每张CD上的艺术家最高销售额,当时我想要的是每位艺术家销量最高的一张CD。 – JCDJulian

相关问题