Задача по выводу информации по выручке в разрезе месяца в SQL

Прошу помощи с решением данной задачи в виде sql запроса в Oracle DB -

дано -

Магазины: • ID • Name

Товары: • Id • Name • Price (стоимость за единицу)

Продажи : • ID Магазина • ID Товара • Дата • Количество единиц товара

необходимо: Вывести информацию по 10 лучшим по выручке магазинам в разрезе месяца.

Такой вариант, наверное некорректен из-за использования Limit?

SELECT id.Магазины, Price*amount AS Выручка
    FROM ТОВАРЫ 
    INNER JOIN ПРОДАЖИ ON ТОВАРЫ.id.Товар=ПРОДАЖИ.id.Товар
    WHERE MONTH(date)=4
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 10;

Ответы (1 шт):

Автор решения: Марина Николаева

Лучше с помощью DENSE_RANK (строкам с одинаковыми значениями выручки присвоятся одинаковые номера, причём по порядку, без пропусков(в отличие от RANK) и появится столбец "Лидер". Для получения итоговой таблицы предлагаю воспользоваться подзапросом с алиасом q:

    SELECT id.Магаз, Лидер \* итоговая таблица, куда можно добавить Выручку и что ещё потребуется*\
    FROM
    (
    SELECT id.Магаз, price*amount AS 
    Выручка
    DENSE_RANK()OVER(ORDER BY 
    price*amount DESC) AS Лидер 
    FROM ТОВАРЫ 
    INNER JOIN ПРОДАЖИ 
    ON ТОВАРЫ.id.Товар=ПРОДАЖИ.id.Товар 
    WHERE MONTH(date)=4
    GROUP BY 1)q 
    WHERE Лидер<=10;

Т.о.,DENSE_RANK() даст одно и то же значение магазинам с одинаковой выручкой независимо от их количества - и все они будут учтены в столбце "Лидер".

→ Ссылка