Ms sql number row: ROW_NUMBER (Transact-SQL) — SQL Server

Функция

ROW_NUMBER в SQL: как ее использовать?

SQL означает язык структурированных запросов, который представляет собой компьютерный язык, используемый для хранения, обработки и извлечения данных из реляционной базы данных. SQL — это язык управления базами данных, который поддерживает создание и удаление баз данных, получение и изменение строк, а также другие функции.

В этом руководстве мы узнаем об одной такой функции SQL, т. е. rownum, и о том, как она используется в SQL.

SQL ROW_NUMBER Функция

Функция ROW_NUMBER — это функция ранжирования SQL, которая присваивает порядковый номер ранга каждой новой записи в разделе.

Когда функция SQL Server ROW NUMBER обнаруживает два одинаковых значения в одном разделе, она присваивает им разные ранговые номера.

Номер ранга будет определяться последовательностью их отображения.

Читайте также: 35 лучших вопросов и ответов на собеседовании по SQL Server

SQL ROW_NUMBER Синтаксис

Синтаксис функции ROW_NUMBER в SQL следующий:

ROW_NUMBER() БОЛЕЕ (

    [РАЗДЕЛ ПО expr1, expr2,. ..]

    ORDER BY expr1 [ASC | DESC], выражение2,…

)

Теперь давайте посмотрим на различные предложения, используемые в приведенном выше синтаксисе.

БОЛЕЕ

В этом предложении указывается окно или набор строк, с которыми работает оконная функция. PARTITION BY и ORDER BY — два возможных предложения предложения OVER.

РАЗДЕЛ ПО

Это необязательное предложение в функции ROW_NUMBER. Это предложение, которое делит набор результатов на разделы (группы строк). Затем к каждому разделу применяется метод ROW_NUMBER(), который присваивает каждому разделу отдельный ранговый номер.

Если предложение partition by не указано, функция ROW NUMBER будет рассматривать весь результат как один раздел и ранжировать его сверху вниз.

ЗАКАЗАТЬ

В каждом разделе это предложение позволяет упорядочить строки в результирующем наборе. Поскольку функция ROW NUMBER() зависит от порядка, это необходимое условие.

Как использовать ROW_NUMBER в SQL-запросе?

Теперь, когда мы рассмотрели основной синтаксис для написания функции ROW_NUMBER в SQL, давайте рассмотрим пример, чтобы понять, как она работает с таблицей SQL-сервера.

Пример

Чтобы понять, как работает функция ROW_NUMBER, мы будем использовать таблицу Employee, как показано ниже.

Данный оператор использует ROW_NUMBER() для присвоения порядкового номера каждому сотруднику в таблице выше.

ВЫБЕРИТЕ

ROW_NUMBER() БОЛЕЕ (

ЗАКАЗ ПО E_id

) номер_строки,

E_name

ИЗ

Сотрудник;

Выход

Читайте также: SQL Create Table: основы лучшего языка баз данных

Как использовать функцию SQL ROW_NUMBER с PARTITION?

Следующий оператор использует функцию ROW_NUMBER для последовательного присвоения целого числа каждому сотруднику в таблице. Пункт о разделе использовался здесь для разделения разных сотрудников в зависимости от их страны.

ВЫБЕРИТЕ

   Е_имя,

   E_country,

   ROW_NUMBER() БОЛЕЕ (

   РАЗДЕЛ ПО E_country

   ЗАКАЗАТЬ ПО E_name

   ) row_num

ИЗ

   Сотрудник

ЗАКАЗАТЬ

   E_country;

Выход

Как видно из приведенного выше вывода, каждый сотрудник был разделен в зависимости от страны. Последовательно назначаемое целое число или ROW_NUMBER повторно инициализируется каждый раз при изменении названия страны.

Как вернуть подмножество строк с помощью CTE и ROW_NUMBER?

В приложениях метод ROW NUMBER() используется для разбиения на страницы. Например, вы можете представить список клиентов по страницам, по 10 строк на каждой странице.

Данный оператор кода показывает использование функции ROW_NUMBER для возврата строк сотрудников от 1 до 5.

CTE определяется как «общее табличное выражение». CTE позволяет создать именованный временный набор результатов, доступный в области выполнения операторов SELECT, INSERT, UPDATE, DELETE или MERGE.

С КТЭ КАК (

ВЫБЕРИТЕ

     НОМЕР_СТРОКИ() БОЛЕЕ(

          ЗАКАЗАТЬ

             E_name

     ) row_num,

     E_id,

     E_name

  ИЗ

     Сотрудник

) ВЫБЕРИТЕ

E_id,

E_name

ИЗ

кт

ГДЕ

row_num > 1 И

номер_строки <= 5;

Выход

В приведенном выше примере CTE использует метод ROW NUMBER() для присвоения последовательного целого числа каждой строке результирующего набора.

Во-вторых, внешний запрос вернул строки с номерами от 1 до 5.

Заключение

В этой статье мы узнали о функции ROW_NUMBER в SQL и о том, как она используется в различных ситуациях с разделением и cte для получения результатов в соответствии с нашими потребностями. Если вы хотите узнать больше об SQL и пройти сертификацию, ознакомьтесь с сертификационным курсом Simplilearn по SQL.

Кроме того, если у вас есть какие-либо сомнения, не стесняйтесь оставлять их в разделе комментариев, и наши специалисты помогут вам.

sql — Как использовать ROW_NUMBER()?

Спросил

Изменено
1 год, 11 месяцев назад

Просмотрено
974k раз

210

Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.

Я хочу использовать ROW_NUMBER() , чтобы получить. ..

  1. Чтобы получить max(ROW_NUMBER()) —> Или я думаю, что это также будет подсчет всех строк

Я пытался сделать:

 SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
 

но, похоже, это не сработало…

  1. Чтобы получить ROW_NUMBER() , используя заданную часть информации, т.е. если у меня есть имя, и я хочу знать, из какой строки оно появилось.

Я предполагаю, что это будет что-то похожее на то, что я пробовал для # 1

 SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'
 

но и это не сработало…

Есть идеи?

  • sql
  • sql-сервер
  • номер строки

0

На первый вопрос, почему бы просто не использовать?

 ВЫБРАТЬ СЧЕТ(*) ИЗ myTable
 

, чтобы получить счет.

И второй вопрос: первичный ключ строки — это то, что следует использовать для идентификации конкретной строки. Не пытайтесь использовать для этого номер строки.


Если вы вернули Row_Number() в своем основном запросе,

 SELECT ROW_NUMBER() OVER (Упорядочить по идентификатору) AS RowNumber, Field1, Field2, Field3
ОТ пользователя
 

Затем, когда вы хотите вернуться на 5 строк назад, вы можете взять текущий номер строки и использовать следующий запрос для определения строки с currentrow -5

 SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     ОТ пользователя ) нас
ГДЕ Строка = ТекущаяСтрока - 5
 

2

Хотя я согласен с другими, что вы можете использовать count() для получения общего количества строк, вот как вы можете использовать row_count() :

  1. Чтобы получить общее количество строк:

     с температурой как (
        выберите row_number() поверх (упорядочить по идентификатору) как rownum
        из имя_таблицы
    )
    выберите max(rownum) из temp 
  2. Чтобы получить номера строк, где имя Мэтт:

     с температурой как (
        выберите имя, row_number() поверх (упорядочить по идентификатору) как rownum
        из имя_таблицы
    )
    выберите rownum из temp, где имя похоже на «Matt» 

Далее можно использовать min(rownum) или max(rownum) , чтобы получить первую или последнюю строку для Мэтта соответственно.

Это были очень простые реализации row_number() . Вы можете использовать его для более сложной группировки. Посмотрите мой ответ о расширенной группировке без использования подзапроса

.
2

Если вам нужно вернуть общее количество строк в таблице, вы можете использовать альтернативный способ SELECT COUNT(*) 9Заявление 0187.

Поскольку SELECT COUNT(*) выполняет полное сканирование таблицы для возврата количества строк, это может занять очень много времени для большой таблицы. В этом случае вы можете использовать системную таблицу sysindexes . Существует столбец ROWS , который содержит общее количество строк для каждой таблицы в вашей базе данных. Вы можете использовать следующий оператор выбора:

 SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2
 

Это значительно сократит время выполнения вашего запроса.

2

Вы можете использовать это для получения первой записи, где есть пункт

 SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum
ОТ пользователей
ГДЕ имя пользователя = 'Джо'
ЗАКАЗАТЬ ПО ROWNUM ASC
 

ROW_NUMBER() возвращает уникальный номер для каждой строки, начиная с 1. Вы можете легко использовать это, просто написав:

 ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) как ROW_NUMBER
 

Может не иметь отношения к этому вопросу. Но я обнаружил, что это может быть полезно при использовании ROW_NUMBER -

 ВЫБЕРИТЕ *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID
ОТ #Any_Table
 
 выбрать
  Мл.Хид,
  мл.блокид,
  row_number() over (раздел по ml.blockid в соответствии с описанием Ml.Hid) как rownumber,
  H.HNAME
от MIT_LeadBechmarkHamletwise ML
присоединиться к [MT.HAMLE] h на ML.Hid=h.HID
 
 ВЫБЕРИТЕ число, Имя пользователя ОТ
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  От пользователей) AS пронумерован
ГДЕ имя_пользователя='Джо'
 

5

Если вы абсолютно хотите использовать для этого ROW_NUMBER (вместо count(*)) вы всегда можете использовать:

 SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)
ОТ ПОЛЬЗОВАТЕЛЕЙ
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC
 

Вы можете использовать Row_Number для ограничения результата запроса.

Пример:

 ВЫБЕРИТЕ * ИЗ (
    выберите row_number() OVER (упорядочить по описанию времени создания) AS ROWINDEX,*
    из TABLENAME ) ТБ
ГДЕ TB.ROWINDEX между 0 и 10
 

--
С приведенным выше запросом я получу СТРАНИЦУ 1 результатов из ИМЯ ТАБЛИЦЫ .

Необходимо создать виртуальную таблицу, используя С таблицей AS , которая упоминается в данном запросе.

Используя эту виртуальную таблицу, вы можете выполнить операцию CRUD с row_number .

ЗАПРОС:

 С таблицей КАК
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-
 

Вы можете использовать ВСТАВИТЬ , ОБНОВИТЬ или УДАЛИТЬ в последнем предложении, несмотря на ВЫБЕРИТЕ .

Функция SQL Row_Number() предназначена для сортировки и присвоения порядкового номера строкам данных в связанном наборе записей. Таким образом, он используется для нумерации строк, например, для определения первых 10 строк с наибольшей суммой заказа или определения заказа каждого клиента с наибольшей суммой и т.