Предположим, мы хотим разбить данные на несколько сегментов, ориентируясь на значения в столбцах.
Решение — использовать функцию
ntile() поверх SQL-окна.Пример
Разобьем сотрудников из таблицы
employees на три группы в зависимости от размера зарплаты:— высокооплачиваемые,
— средние,
— низкооплачиваемые.
select
ntile(3) over w as tile,
name, salary
from employees
window w as (order by salary desc)
order by salary desc, id;
t sal name
1 120 Иван
1 104 Леонид
1 104 Марина
1 100 Анна
2 96 Вероника
2 96 Григорий
2 90 Ксения
3 84 Елена
3 78 Борис
3 70 Дарья
ntile(n) разбивает все записи на n групп и возвращает номер группы для каждой записи. Если общее количество записей (10 в нашем случае) не делится на размер группы (3), то первые группы будут крупнее последних.Нюансы
—
ntile() всегда старается разбить данные так, чтобы группы были одинакового размера. Поэтому записи с одинаковым значением з/п вполне могут попасть в разные (соседние) группы.— Если СУБД не поддерживает инструкцию
window, можно встроить определение окна: ntile(3) over (order by ...)→ Оконные функции SQL