Использование ROW_NUMBER() при группировке PostgreSQL
Новенький в SQL, подскажите, как правильно использовать функцию ROW_NUMBER(), если в запросе уже присутствует GROUP BY.
Приведу пример:
Я пытаюсь обновить поле achievements у сотрудников, кто совершил больше всех продаж.
В achievements должно появиться -- Работник ТОП-1 или Работник ТОП-2 в зависимости от места в топе.
SELECT order_tab.employee_id,
SUM(order_item.price * order_item.quantity) AS total_sum,
COUNT(order_tab.order_id) AS total_clients,
row_number() over (PARTITION BY employee_id) AS number
FROM order_tab
JOIN order_item ON order_tab.order_id = order_item.order_id
GROUP BY order_tab.employee_id
ORDER BY total_sum DESC, total_clients DESC
LIMIT 3;
UPDATE employee SET achievements = concat_ws(', ', achievements, 'Работник ТОП-', number, ' за месяц')
WHERE employee.employee_id IN ( SELECT employee_id
FROM best_employees);
Но во-первых UPDATE не видит поле number из запроса. А во-вторых row_number не выводит то, что нужно
Нужно вот так:
То есть просто порядковый номер
Ответы (2 шт):
Автор решения: Anatoly
→ Ссылка
Поскольку вы уже всё сгруппировали, то вам просто нужна последовательная сквозная нумерация сгруппированных строк с учетом сортировки:
row_number() over (ORDER BY total_sum DESC, total_clients DESC) AS number
Автор решения: Alexander Pavlov
→ Ссылка
with best_employees as (
SELECT order_tab.employee_id,
SUM(order_item.price * order_item.quantity) AS total_sum,
COUNT(order_tab.order_id) AS total_clients
FROM order_tab
JOIN order_item ON order_tab.order_id = order_item.order_id
GROUP BY order_tab.employee_id
ORDER BY total_sum DESC, total_clients DESC
LIMIT 3
)
UPDATE employee
SET achievements = concat_ws(
', ',
achievements,
'Работник ТОП-'||row_number() over (order by total_sum desc, total_clients desc)||' за месяц'
)
from best_employees
WHERE employee.employee_id = best_employees.employee_id
