2017-02-17 2 views
0

Я пытаюсь построить запрос, который выбирает имя группы и имя компакт-диска с наивысшими объемами продаж. Схема выглядит что-то вродеPostgres: ОШИБКА: столбец должен появиться в предложении GROUP BY или использоваться в агрегированной функции

группы (имя_группы groupCode)

кд (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

Если я удалю cd.cdtitle из SELE Заявление 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 от каждого художника с самыми высокими продажами. – JCDJulian