💻 Примеры
⚡ Кратко: примеры
- Нумерация строк по дате —
ROW_NUMBER() OVER (ORDER BY SaleDate). - Ранг по отделам —
RANK() OVER (PARTITION BY DepartmentID ORDER BY SaleAmount DESC). - Ранг без пропусков —
DENSE_RANK() OVER (ORDER BY SaleAmount DESC). - Разделение на группы —
NTILE(3) OVER (ORDER BY SaleAmount).
Пример 1. ROW_NUMBER() — нумерация строк по дате
Присвоить уникальный номер каждой строке в таблице продаж, упорядоченной по дате.
SELECT
SaleID,
SaleDate,
SaleAmount,
ROW_NUMBER() OVER (ORDER BY SaleDate) AS RowNum
FROM Sales;
Результат:
| SaleID | SaleDate | SaleAmount | RowNum |
|---|---|---|---|
| 1 | 2024-01-01 | 100 | 1 |
| 2 | 2024-01-02 | 150 | 2 |
| 3 | 2024-01-03 | 200 | 3 |
Пример 2. RANK() — ранг внутри отдела
Присвоить ранг продажам внутри каждого отдела. При одинаковой сумме продаж строки получают одинаковый ранг, следующий ранг пропускается.
SELECT
ProductID,
DepartmentID,
SaleAmount,
RANK() OVER (PARTITION BY DepartmentID ORDER BY SaleAmount DESC) AS Rank
FROM ProductSales;
Результат:
| ProductID | DepartmentID | SaleAmount | Rank |
|---|---|---|---|
| 1 | 10 | 300 | 1 |
| 2 | 10 | 300 | 1 |
| 3 | 10 | 200 | 3 |
| 4 | 20 | 500 | 1 |
| 5 | 20 | 400 | 2 |
Пример 3. DENSE_RANK() — ранг без пропусков
Ранжировать продукты по убыванию суммы продаж без пропусков значений.
SELECT
ProductID,
SaleAmount,
DENSE_RANK() OVER (ORDER BY SaleAmount DESC) AS DenseRank
FROM ProductSales;
Результат:
| ProductID | SaleAmount | DenseRank |
|---|---|---|
| 4 | 500 | 1 |
| 5 | 400 | 2 |
| 1 | 300 | 3 |
| 2 | 300 | 3 |
| 3 | 200 | 4 |
Проверить по документации: таблица результата упорядочена по SaleAmount DESC, чтобы соответствовать выражению OVER (ORDER BY SaleAmount DESC). В исходном конспекте пример результата выглядит несогласованным с сортировкой.
Пример 4. NTILE() — разделение на группы
Разделить все продажи на 3 группы по возрастанию суммы.
SELECT
SaleID,
SaleAmount,
NTILE(3) OVER (ORDER BY SaleAmount) AS Quartile
FROM Sales;
Результат:
| SaleID | SaleAmount | Quartile |
|---|---|---|
| 1 | 100 | 1 |
| 2 | 200 | 1 |
| 3 | 300 | 2 |
| 4 | 400 | 2 |
| 5 | 500 | 3 |