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

Я хочу использовать ROW_NUMBER() для получения...

  • Чтобы получить 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'

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

Любые идеи?

Ответ 1

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

SELECT COUNT(*) FROM myTable 

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

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


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

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User

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

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5   

Ответ 2

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

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

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  • Чтобы получить номера строк, имена которых принадлежат Matt:

    with temp as (
        select name, row_number() over (order by id) as rownum
        from table_name
    )
    select rownum from temp where name like 'Matt'

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

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

Ответ 3

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

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

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

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

Ответ 4

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

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER

Вы можете найти разницу между Row_number(), Rank() и Dense_Rank() здесь.

Ответ 5

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

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC

Ответ 6

SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'

Ответ 7

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

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table

Ответ 8

select 
  Ml.Hid,
  ml.blockid,
  row_number() over (partition by ml.blockid order by Ml.Hid desc) as rownumber,
  H.HNAME 
from MIT_LeadBechmarkHamletwise ML
join [MT.HAMLE] h on ML.Hid=h.HID

Ответ 10

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

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC

Ответ 11

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

Пример:

SELECT * FROM (
    select row_number() OVER (order by createtime desc) AS ROWINDEX,* 
    from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

- С приведенным выше запросом я получаю PAGE 1 результатов от TABLENAME.

Ответ 12

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

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

QUERY:

WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-

Вы можете использовать INSERT, UPDATE или DELETE в последнем предложении, несмотря на SELECT.

Ответ 13

Этот запрос:

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.

Ответ 14

Функция 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