Проблем:
Бихте искали да дадете на всеки ред в таблицата с резултати отделно число.
Пример:
Нашата база данни има таблица с име furniture с данни в следните колони:code (първичен ключ) и name .
| код | име |
|---|---|
| 101 | легло |
| 202 | диван |
| 333 | стол |
| 123 | библиотечка |
| 235 | таблица |
| 766 | бюро |
furniture таблицата съхранява имената на мебелите, които искаме да номерираме.
Решение:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
Заявката връща номера на реда на всяка мебел заедно с нейното име и код:
| num_row | име | код |
|---|---|---|
| 1 | легло | 101 |
| 2 | диван | 202 |
| 3 | стол | 333 |
| 4 | библиотечка | 123 |
| 5 | таблица | 235 |
| 6 | бюро | 766 |
Имайте предвид, че имената на мебелите не са сортирани.
Дискусия:
Ако искате да номерирате всеки ред в набор от резултати, SQL предоставя ROW_NUMBER() функция. Тази функция се използва в SELECT клауза с други колони. След ROW_NUMBER() клауза, ние наричаме OVER() функция. Ако подадете някакви аргументи на OVER , номерирането на редовете няма да бъде сортирано според нито една колона. По този начин редът на показваните редове ще бъде недетерминиран; в повечето случаи това е реда, в който записите са били вмъкнати в таблицата. Номерирането на редовете започва от 1. В нашия пример всеки запис има число от 1 до 6.
Можем също да присвоим номера на редове с помощта на колона. В примера по-долу номерираме записи, сортирани по име. Правим това, като предаваме този аргумент на OVER заедно с ORDER BY (сортира записите според колоната с име):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Докато разглеждате набора от резултати, виждате сортираните редове с техните номера:
| row | име | код |
|---|---|---|
| 1 | легло | 101 |
| 2 | библиотечка | 123 |
| 3 | стол | 333 |
| 4 | бюро | 766 |
| 5 | диван | 202 |
| 6 | таблица | 235 |
Номерацията, предоставена от ROW_NUMBER() е независимо от реда на редовете в таблицата с резултати. В примера по-долу номерираме записи, използвайки сортирано име на колона (OVER(ORDER BY name) ), но показваме записи в набора от резултати според друга колона (в нашия пример ORDER BY code ).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
Заявката върна номера на всеки ред, но тези числа не са във възходящ ред, тъй като записите са сортирани според кода на колоната:
| row | име | код |
|---|---|---|
| 1 | легло | 101 |
| 2 | библиотечка | 123 |
| 5 | диван | 202 |
| 6 | таблица | 235 |
| 3 | стол | 333 |
| 4 | бюро | 766 |
Редът по подразбиране на сортираните редове е възходящ, но можете също да сортирате в низходящ ред, като използвате DESC ключова дума след името на колоната, по която искате да сортирате:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
Заявката по-горе върна резултатния набор:
| row | име | код |
|---|---|---|
| 4 | бюро | 766 |
| 3 | стол | 333 |
| 6 | таблица | 235 |
| 5 | диван | 202 |
| 2 | библиотечка | 123 |
| 1 | легло | 101 |