Как я могу использовать 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 ]

133 голосов
/ 07 июня 2009

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

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   
40 голосов
/ 09 июня 2009

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

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

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  2. Чтобы получить номера строк с именем 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), чтобы получить первый или последний ряд для Мэтта соответственно.

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

24 голосов
/ 07 июня 2009

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

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

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

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

7 голосов
/ 21 апреля 2017

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

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

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

4 голосов
/ 07 июня 2009
SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'
3 голосов
/ 14 декабря 2018
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
3 голосов
/ 16 октября 2018

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

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC
3 голосов
/ 19 октября 2017

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

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table
2 голосов
/ 31 октября 2018

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

Используя эту виртуальную таблицу, вы можете выполнить операцию CRUD w.r.t 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.

2 голосов
/ 06 января 2017

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

Пример:

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

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

...