Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как ROW_NUMBER() работи в SQL Server

В 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 за всеки жанр.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да идентифицираме дублирането на първичния ключ от код за грешка на SQL Server 2008?

  2. Получаване на върната стойност от съхранената процедура в C#

  3. Знаете ли кога да опитате отново или да не успеете при извикване на SQL Server от C#?

  4. Добавете изчислена колона към съществуваща таблица в SQL Server

  5. Android достъп до отдалечена SQL база данни