Как использовать ROW_NUMBER()?
Я хочу использовать ROW_NUMBER()
для получения...
- Чтобы получить
max(ROW_NUMBER())
→ Или я предполагаю, что это также будет счет всех строк
Я пробовал делать:
SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
но он, похоже, не работал...
- Получить
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
Ответ 9
Взяв ваш листинг буквально, вот запись в блоге, объясняющая так называемые функции окна (где row_number является одним из них):
http://www.depesz.com/index.php/2009/01/21/waiting-for-84-window-functions/
Ответ 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