WHERE Вид< 2
ORDER BY Основа, Блюдо;
| Результат
| |
| Номер
| Блюдо
| Основа
|
|
| Сметана
| Молоко
|
|
| Творог
| Молоко
|
|
| Мясо с гарниром
| Мясо
|
|
| Салат мясной
| Мясо
|
|
| Салат витаминный
| Овощи
|
|
| Салат летний
| Овощи
|
|
| Паштет из рыбы
| Рыба
|
|
| Салат рыбный
| Рыба
|
В первом случае мы получаем неплотную нумерацию (номер группы — порядковый номер строки, с которого начинается группа), во втором — плотную.
Как и для функции ROW_NUMBER, в предложении OVER может использоваться конструкция PARTITION BY, разбивающая весь набор строк, возвращаемых запросом, на группы, к которым затем применяется соответствующая функция.
Запрос
SELECT rank() over(partition BYОснова ORDER BY Вес) as Номер, Блюдо, Основа
| Результат
| |
| Номер
| Блюдо
| Основа
| Вес
|
|
| Сметана
| Молоко
|
|
|
| Творог
| Молоко
|
|
|
| Мясо с гарниром
| Мясо
|
|
|
| Салат мясной
| Мясо
|
|
|
| Салат витаминный
| Овощи
|
|
|
| Салат летний
| Овощи
|
|
|
| Паштет из рыбы
| Рыба
|
|
|
| Салат рыбный
| Рыба
|
|
FROM Блюда
WHERE Вид < 2
ORDER BY Основа, Блюдо;
позволяет в каждой группе, определяемой основой, ранжировать блюда по весу в порядке его возрастания.
Творог и сметана имеют одинаковый номер в группе, так как их вес совпадает.
А вот как можно выбрать самые легкие блюда в каждой категории:
SELECT *
FROM (SELECT rank() over(partition BYОснова ORDER BY Вес) as Номер,
Блюдо, Основа