Social Icons

.

среда, 2 мая 2012 г.

Порядковый номер строки как результат запроса Transact-SQL: ROW_NUMBER

SQL Server 2012
Возвращает последовательный номер строки в секции результирующего набора, 1 соответствует первой строке в каждой из секций.
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , … [ n ] ] order_by_clause ) 

Аргументы

PARTITION BY value_expression
Делит результирующий набор, полученный по предложению FROM, на секции, к которым применяется функция ROW_NUMBER. value_expression определяет столбец, по которому секционируется результирующий набор. Если PARTITION BY не указан, функция обрабатывает все строки результирующего набора запроса как одну группу. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL). order_by_clause
Предложение ORDER BY определяет последовательность, в которой строкам назначаются уникальные номера с помощью функции ROW_NUMBER в пределах указанной секции. Оно должно указываться обязательно. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL).

Типы возвращаемых данных 

- bigint

Общие примечания

Нет гарантии того, что строки, возвращенные запросом, использующим ROW_NUMBER(), будут расставлены точно в одинаковом порядке после каждого выполнения, если не соблюдены следующие условия.
  • Все значения в секционированном столбце являются уникальными.
  • Все значения в столбцах ORDER BY являются уникальными.
  • Сочетания значений из столбца секционирования и столбцов ORDER BY являются уникальными.

Примеры

А. Возврат номера строки

SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, 
    FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" 
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
Б. Возврат подмножества строк

WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
    FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, OrderDate, RowNumber  
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;
В. Использование ROW_NUMBER() с PARTITION

SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;

Оригинал

Комментариев нет:

Отправить комментарий

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

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