Я написал этот SQL, извлекая квартал календаря из SHIP_DATE; Вы можете настроить по мере необходимости.
Точно так же RANK (), ROW_NUMBER () и DENSE_RANK () все разные; Возможно, вы захотите поэкспериментировать с каждой аналитической функцией, чтобы выяснить, какие из них лучше всего соответствуют вашим данным, и как они работают.
SELECT *
FROM (SELECT RANK() OVER (PARTITION BY SHIP_QUARTER
ORDER BY PROFIT_GENERATED desc) AS PROFIT_RANK_BY_Q,
ORIG.*
FROM
(SELECT EXTRACT(QUARTER from SHIP_DATE) AS SHIP_QUARTER,
PRODUCT_NAME,
SUM(QUANTITY) "QTY_SOLD", SALES, SUM(PROFIT) "PROFIT_GENERATED"
FROM DELIVERIES_FACT
WHERE EXTRACT(YEAR from SHIP_DATE) = 2015
GROUP BY EXTRACT(QUARTER from SHIP_DATE), PRODUCT_NAME, SALES
)
)
WHERE PROFIT_RANK_BY_Q <= 3
order by SHIP_QUARTER, PROFIT_RANK_BY_Q