我正在尝试构建一个选择组名的查询和销售额最高的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名称吗?
答案 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