Поделиться через


NTILE (Transact-SQL)

Распределяет строки упорядоченной секции в заданное количество групп. Группы нумеруются, начиная с единицы. Для каждой строки функция NTILE возвращает номер группы, которой принадлежит строка.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

NTILE (integer_expression)    OVER ( [ <partition_by_clause> ] < order_by_clause > )

Аргументы

  • integer_expression
    Положительное целое выражение-константа, указывающее количество групп, на которые необходимо разделить каждую секцию. Аргумент integer_expression может иметь тип int или bigint.

    ПримечаниеПримечание

    Аргумент integer_expression может ссылаться только на столбцы в предложении PARTITION BY и не может ссылаться на столбцы, перечисленные в текущем предложении FROM.

  • <partition_by_clause>
    Делит результирующий набор, сформированный предложением FROM, на секции, к которым применяется функция RANK. Синтаксис предложения PARTITION BY см. в разделе Предложение OVER (Transact-SQL).

  • < order_by_clause >
    Определяет порядок назначения значений функции NTILE строкам секции. Дополнительные сведения см. в разделе Предложение ORDER BY (Transact-SQL). Целое значение не может представлять столбец < order_by_clause > при использовании его в ранжирующей функции.

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

bigint

Замечания

Если количество строк в секции не делится на integer_expression, формируются группы двух размеров, отличающихся на единицу. В порядке, заданном предложением OVER, группы большего размера следуют перед группами меньшего размера. Например, если общее число строк равно 53, а число групп равно пяти, первые три группы будут состоять из 11 строк, а оставшиеся две — из 10. С другой стороны, если общее число строк делится на число групп, строки распределяются равномерно по всем группам. Например, если общее число строк равно 50 и задано пять групп, каждый сегмент будет состоять из 10 строк.

Примеры

А. Разделение строк на группы

В следующем примере строки разделяются на четыре группы. Так как общее число строк не делится на количество групп, первая группа будет состоять из четырех строк, а остальные — из трех.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS 'Quartile'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;
GO

Б. Разделение результирующего набора с помощью ключевого слова PARTITION BY

В следующем примере к коду из примера A добавляется аргумент PARTITION BY. Строки вначале разделяются по столбцу PostalCode, а затем разделяются на четыре группы для каждого значения PostalCode. Обратите внимание, что ключевое слово ORDER BY в предложении OVER упорядочивает NTILE, а в инструкции SELECT — результирующий набор.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,NTILE(4) OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Quartile'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0
ORDER BY LastName;
GO