@crushilov
Аналитик

Почему возникает ошибка при использовании оконной функции?

Мне необходимо вывести топ 3 товара по выручке и их долю в общей выручке. Чтобы рассчитать долю, я пытаюсь применить оконную функцию:

SELECT "Items"."itemId", sum(price) / sum(price) OVER ()
FROM
	"Items"
	INNER JOIN "Purchases" USING("itemId")
GROUP BY "Items"."itemId"

, но выдает следующую ошибку:

ERROR: ОШИБКА:  столбец "Items.price" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
LINE 10: SELECT "Items"."itemId", sum(price) / sum(price) OVER ()
                                                   ^


SQL state: 42803
Character: 332

Не могу понять, в чем проблема. Почему я должен в группировку отправить "Items".price?
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Проблема в том, что после группировки поля исходных таблиц недоступны, если они не включены в выражение группировки.

Правильно:

SELECT "Items"."itemId", sum(price) / sum( sum(price) ) OVER ()
FROM "Items"
INNER JOIN "Purchases" USING("itemId")
GROUP BY "Items"."itemId"


Т.е. оконная функция применяется не к исходному полю, а к агрегатной функции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы