Проблем:
Бихте искали да дадете на всеки ред в таблицата с резултати отделно число.
Пример:
Нашата база данни има таблица с име 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 |