Как я могу использовать ROW_NUMBER ()? - PullRequest
153 голосов
/ 07 июня 2009

Я хочу использовать 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'

но это тоже не сработало ...

Есть идеи?

Ответы [ 13 ]

2 голосов
/ 28 апреля 2016

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

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC
0 голосов
/ 16 октября 2018

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

Если вы хотите отсортировать набор данных и пронумеровать каждую строку, разделив их на категории, мы используем Row_Number () с предложением Partition By. Например, сортировка заказов каждого клиента внутри себя, где набор данных содержит все заказы и т. Д.

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

Но, насколько я понимаю, вы хотите рассчитать количество строк, сгруппированных по столбцу. Чтобы визуализировать требование, если вы хотите видеть количество всех заказов связанного клиента как отдельный столбец, кроме информации о заказе, вы можете использовать функцию агрегирования COUNT () с предложением Partition By

Например,

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader
0 голосов
/ 12 октября 2018

Этот запрос:

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

вернет все строки, где UserName равно 'Joe', ЕСЛИ У вас нет UserName='Joe'

Они будут перечислены в порядке UserID, а поле row_number начнется с 1 и будет увеличиваться, однако многие строки содержат UserName='Joe'

Если она не работает для вас, то у вашей команды WHERE есть проблема ИЛИ в таблице нет UserID. Проверьте орфографию для обоих полей UserID и UserName.

...