В SQL Server, ROW_NUMBER()
функцията ви позволява да номерирате изхода на набор от резултати. Връща поредния номер на всеки ред, започващ от 1.
Ако посочите дялове за набора от резултати, всеки дял кара номерирането да започне отново (т.е. номерирането ще започне от 1 за първия ред във всеки дял).
Синтаксис
Синтаксисът е така:
ROW_NUMBER ( ) НАД ( [ PARTITION BY value_expression , ... [n ] ] order_by_clause )
PARTITION BY value_expression
е по избор. Той разделя резултатния набор, произведен от FROM
клауза в дялове, към които се прилага функцията. израз на стойност определя колоната, по която се разделя резултантният набор. Ако PARTITION BY
клаузата не е посочена, всички редове от набора от резултати от заявката се третират като една група.
ROW_NUMBER
в рамките на определен дял.
Имайте предвид, че OVER
клаузата обикновено приема
Пример 1 – Основна употреба
Ето основен пример, показващ как работи тази функция:
ИЗБЕРЕТЕ ROW_NUMBER() НАД (ПОРЪЧКА ПО AlbumId ASC) 'Row', AlbumId, AlbumNameFROM Албуми;
Резултат:
+-------+-----------+------------------------------ +| Ред | ID на албума | Име на албум ||-------+-----------+------------------------------| | 1 | 1 | Powerslave || 2 | 2 | Мощност || 3 | 3 | Пеене надолу по алеята || 4 | 4 | Зилтоид Всезнаещият || 5 | 5 | Жертви на Cool || 6 | 6 | Epicloud || 7 | 7 | Някъде във времето || 8 | 8 | Част от ума || 9 | 9 | Убийци || 10 | 10 | Без молитва за умиращите || 11 | 11 | Няма звук без тишина || 12 | 12 | Big Swing Face || 13 | 13 | Синя нощ || 14 | 14 | Вечност || 15 | 15 | Скандинавия || 16 | 16 | Дълго изгубен куфар || 17 | 17 | Похвала и порицание || 18 | 18 | Дойде Джоунс || 19 | 19 | Цяла нощ грешно || 20 | 20 | Шестнадесетте мъже от Тайн || 21 | 21 | Yo Wassup || 22 | 22 | Скъсан |+-------+-----------+------------------------------+
В този случай можем да видим, че номерата на редовете се подравняват перфектно със стойностите в AlbumId
колона. Това е чисто случайно. Това се случва, защото AlbumId
колоната използва нарастваща стойност, започваща от 1, което също е това, което ROW_NUMBER()
използва.
Номерирането на редовете е свързано с AlbumId
колона до степента, в която е подредена от тази колона. Но това не означава, че стойностите трябва да са еднакви.
Пример 2 – Добавете клауза WHERE
Добавяне на WHERE
клауза ще покаже какво имам предвид.
ИЗБЕРЕТЕ ROW_NUMBER() НАД (ПОРЪЧКА ПО AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsWHERE AlbumId> 15;
Резултат:
+-------+-----------+------------------------------+ | Ред | ID на албума | Име на албум ||-------+-----------+------------------------------|| 1 | 16 | Дълго изгубен куфар || 2 | 17 | Похвала и порицание || 3 | 18 | Дойде Джоунс || 4 | 19 | Цяла нощ грешно || 5 | 20 | Шестнадесетте мъже от Тайн || 6 | 21 | Yo Wassup || 7 | 22 | Скъсан |+-------+-----------+------------------------+предварително>Пример 3 – Превключване на подреждането
Подреждането по низходящ ред вместо възходящо също демонстрира тази концепция.
ИЗБЕРЕТЕ ROW_NUMBER() НАД (ПОРЪЧАЙТЕ ПО идентификатор на албума DESC) 'Row', AlbumId, AlbumNameFROM Албуми;Резултат:
+-------+-----------+------------------------------ +| Ред | ID на албума | Име на албум ||-------+-----------+------------------------------| | 1 | 22 | Скъсан || 2 | 21 | Yo Wassup || 3 | 20 | Шестнадесетте мъже от Тайн || 4 | 19 | Цяла нощ грешно || 5 | 18 | Дойде Джоунс || 6 | 17 | Похвала и порицание || 7 | 16 | Дълго изгубен куфар || 8 | 15 | Скандинавия || 9 | 14 | Вечност || 10 | 13 | Синя нощ || 11 | 12 | Big Swing Face || 12 | 11 | Няма звук без тишина || 13 | 10 | Без молитва за умиращите || 14 | 9 | Убийци || 15 | 8 | Част от ума || 16 | 7 | Някъде във времето || 17 | 6 | Epicloud || 18 | 5 | Жертви на Cool || 19 | 4 | Зилтоид Всезнаещият || 20 | 3 | Пеене надолу по алеята || 21 | 2 | Мощност || 22 | 1 | Powerslave |+-------+-----------+------------------------------+Пример 4 – Подреждане по различна колона
И докато сме готови, нека подредим по
AlbumName
вместо колона.ИЗБЕРЕТЕ ROW_NUMBER() НАД (ПОРЪЧАЙТЕ ПО Име на албум ASC) 'Row', AlbumId, AlbumNameFROM Албуми;Резултат:
+-------+-----------+------------------------------ +| Ред | ID на албума | Име на албум ||-------+-----------+------------------------------| | 1 | 19 | Цяла нощ грешно || 2 | 18 | Дойде Джоунс || 3 | 12 | Big Swing Face || 4 | 13 | Синя нощ || 5 | 22 | Скъсан || 6 | 5 | Жертви на Cool || 7 | 6 | Epicloud || 8 | 14 | Вечност || 9 | 9 | Убийци || 10 | 16 | Дълго изгубен куфар || 11 | 10 | Без молитва за умиращите || 12 | 11 | Няма звук без тишина || 13 | 8 | Част от ума || 14 | 2 | Мощност || 15 | 1 | Powerslave || 16 | 17 | Похвала и порицание || 17 | 15 | Скандинавия || 18 | 3 | Пеене надолу по алеята || 19 | 7 | Някъде във времето || 20 | 20 | Шестнадесетте мъже от Тайн || 21 | 21 | Yo Wassup || 22 | 4 | Зилтоид Всезнаещият |+-------+----------+------------------------- -+Пример 5 – Дялове
Както споменахме, можете също да разделите резултатите на дялове. Когато направите това, номерирането започва отново от 1 за всеки нов дял.
Пример:
ИЗБЕРЕТЕ Жанр, ROW_NUMBER() НАД (РАЗДЕЛЕНИЕ ПО Жанр ORDER BY AlbumId ASC) 'Row', AlbumId, AlbumNameFROM AlbumsINNER JOIN Genres ON Albums.GenreId =Genres.GenreId;Резултат:
+--------+-------+-----------+---------------- ----------+| Жанр | Ред | ID на албума | Име на албум ||--------+-------+----------+---------------- ---------|| Държава | 1 | 3 | Пеене надолу по алеята || Държава | 2 | 21 | Yo Wassup || Държава | 3 | 22 | Скъсан || Джаз | 1 | 12 | Big Swing Face || Джаз | 2 | 19 | Цяла нощ грешно || Джаз | 3 | 20 | Шестнадесетте мъже от Тайн || Поп | 1 | 11 | Няма звук без тишина || Поп | 2 | 13 | Синя нощ || Поп | 3 | 14 | Вечност || Поп | 4 | 15 | Скандинавия || Поп | 5 | 16 | Дълго изгубен куфар || Поп | 6 | 17 | Похвала и порицание || Поп | 7 | 18 | Дойде Джоунс || Рок | 1 | 1 | Powerslave || Рок | 2 | 2 | Мощност || Рок | 3 | 4 | Зилтоид Всезнаещият || Рок | 4 | 5 | Жертви на Cool || Рок | 5 | 6 | Epicloud || Рок | 6 | 7 | Някъде във времето || Рок | 7 | 8 | Част от ума || Рок | 8 | 9 | Убийци || Рок | 9 | 10 | Без молитва за умиращите |+---------+-------+-----------+------------ ------------+Още веднъж можем да видим, че
ROW_NUMBER
иAlbumId
колоните са напълно некорелирани.В този случай разделям по
Genre
колона. Това кара номерацията да започне отново от 1 за всеки жанр.