Топ-5 продуктов по выручке, с проданным количеством и детерминированным добором ничьих
Таблица order_items(product_id, quantity, unit_price). Верните пять продуктов с наибольшей суммарной выручкой, где выручка — SUM(quantity * unit_price). Верните также суммарное проданное количество по продукту. Отсортируйте по выручке по убыванию и разрешите ничьи детерминированно, чтобы запрос был воспроизводим.
-- сагрегируйте order_items по продукту, затем отсортируйте и оставьте 5
Напишите запрос.
Агрегируют по продукту, затем сортируют и ограничивают: SELECT product_id, SUM(quantity) AS qty, SUM(quantity*unit_price) AS revenue FROM order_items GROUP BY product_id ORDER BY revenue DESC, product_id LIMIT 5. Вторичный ключ product_id делает ничьи детерминированными.
- ✗Выбирать product_id без GROUP BY по нему
- ✗Ранжировать по количеству вместо выручки
- ✗Использовать LIMIT без добора ничьих, и запуски расходятся
- →Как вернуть ничьи на 5-м месте, а не обрезать их?
- →Что меняется, если unit_price может быть NULL?
Group the line items by product, sum revenue and quantity, then order and limit. A second sort key (product_id) makes the ranking repeatable when two products tie on revenue.
SELECT product_id,
SUM(quantity) AS qty,
SUM(quantity * unit_price) AS revenue
FROM order_items
GROUP BY product_id
ORDER BY revenue DESC, product_id
LIMIT 5;
ORDER BY revenue DESC alone is not deterministic: tied products can come back in any order between runs, so the fifth row is unstable. To keep every product tied at the cutoff instead of an arbitrary five, rank with RANK() OVER (ORDER BY revenue DESC) and keep rnk <= 5.