8урок по oracle sql, Логика SELECT и аналитические функции
--Выборка данных - SELECT
--Возможные члены: SELECT, FROM, WHERE, GROUP BY, HAVING, PIVOT, UNPIVOT, CONNECT BY, ORDER BY. --Члены SELECT и FROM в конструкции - обязательны.
--Проризводительность во многом завист от правильно спланированного запроса
--Т.е. отсечение ненужных данных на уровне WHERE даст большую производительность, чем на уровне HAVING например
--Т.к. далее в обработке уже не будут участвовать не нужные нам данные --Логика обработки этапов SELECT:
--FROM
--PIVOT, UNPIVOT
--CONNECT BY
--WHERE
--GROUP BY
--HAVING
--ORDER BY
--SELECT
--Выдает уникальные значения
--DISTINCT - пример SELECT DISTINCT FIRST_NAME FROM HR.EMPLOYEES
--Все дубляжи - SELECT FIRST_NAME FROM HR.EMPLOYEES GROUP BY FIRST_NAME HAVING COUNT(*) > 1
--Аналитические функции
--ROW_NUMBER - нумерует строки, возвращаемые запросом.
--RANK и DENSE_RANK - нумеруют строки, которые имеют одинаковые значения в столбцах, по которым выполняется упорядочивание
--Такие строки получают одинаковые номера (ранги).
--Разница между ними в шаге приращения ранга (по самому рангу или по позиции строки)
SELECT
FIRST_NAME
, SALARY
, ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS row_number_desc
, ROW_NUMBER() OVER (ORDER BY SALARY) AS row_number_asc
, RANK() OVER (ORDER BY SALARY) AS rank
, DENSE_RANK() OVER (ORDER BY SALARY) AS dense_rank
FROM HR.EMPLOYEES
;
--RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - суммируем по ORDER BY FIRST_NAME
SELECT
FIRST_NAME
, SALARY
, SUM(SALARY) OVER
(
ORDER BY FIRST_NAME
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS sum_over_range
FROM HR.EMPLOYEES
;