Если ты всё ещё используешь
GROUP BY + подзапросы для расчёта рангов, окон и сумм — переходи на аналитические функции. Они читаются проще, работают быстрее и избавляют от лишних джойнов.🔧 Пример: вместо этого
SELECT department_id, employee_id, salary
FROM (
SELECT department_id, employee_id, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees
)
WHERE rnk = 1;
🔥 Используй:
SELECT *
FROM (
SELECT e.*, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees e
)
WHERE rnk = 1;
📌 Что это даёт:
•
RANK(), DENSE_RANK(), ROW_NUMBER() — вычисляются без лишнего JOIN •
PARTITION BY делит данные по группам без агрегирования •
OVER (...) даёт гибкость без переписывания логики⚡ Аналитические функции в Oracle — это:
• меньше кода
• выше производительность
• идеально для дашбордов, отчётов и сложной аналитики
🧠 Вывод: перестань бороться с GROUP BY — используй
OVER() и управляй данными как потоком.