NTILE (Transact-SQL)
Aktualisiert: 17. Juli 2006
Verteilt die Zeilen in einer sortierten Partition in eine angegebene Anzahl von Gruppen. Die Gruppen sind nummeriert, wobei mit Eins begonnen wird. Für jede Zeile gibt NTILE die Nummer der Gruppe zurück, zu der die Zeile gehört.
Transact-SQL-Syntaxkonventionen
Syntax
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Argumente
integer_expression
Ein konstanter Ausdruck aus einer positiven ganzen Zahl, der die Anzahl von Gruppen angibt, in die jede Partition unterteilt werden kann. integer_expression kann vom Datentyp int oder bigint sein.Hinweis: integer_expression kann nur auf Spalten in der PARTITION BY-Klausel verweisen. integer_expression kann nicht auf in der aktuellen FROM-Klausel aufgelistete Spalten verweisen.
- <partition_by_clause>
Teilt das von der FROM-Klausel erstellte Resultset in Partitionen, auf die die RANK-Funktion angewendet wird. Informationen zur Syntax von PARTITION BY finden Sie unter OVER-Klausel (Transact-SQL).
- < order_by_clause >
Bestimmt die Reihenfolge, in der die NTILE-Werte den Zeilen in einer Partition zugeordnet werden. Weitere Informationen finden Sie unter ORDER BY-Klausel (Transact-SQL). Eine ganze Zahl kann keine Spalte darstellen, wenn < order_by_clause > in einer Rangfolgefunktion verwendet wird.
Rückgabetypen
bigint
Hinweise
Falls die Anzahl der Zeilen in einer Partition nicht durch den integer_expression-Wert geteilt werden kann, führt dies zu Gruppen mit zwei unterschiedlichen Größen, die sich um ein Mitglied unterscheiden. Größere Gruppen stehen vor kleineren Gruppen in der von der OVER-Klausel angegebenen Reihenfolge. Wenn die Gesamtanzahl der Zeilen z. B. 53 beträgt und fünf Gruppen verwendet werden, enthalten die ersten drei Gruppen 11 Zeilen und die beiden anderen Gruppen 10 Zeilen. Falls jedoch die Gesamtanzahl der Zeilen durch die Anzahl von Gruppen teilbar ist, werden die Zeilen gleichmäßig auf die Gruppen verteilt. Wenn z. B. insgesamt 50 Zeilen und fünf Gruppen vorhanden sind, enthält jedes Bucket 10 Zeilen.
Beispiele
A. Unterteilen von Zeilen in Gruppen
Im folgenden Beispiel werden die Zeilen in vier Gruppen aufgeteilt. Da die Gesamtanzahl der Zeilen nicht durch die Anzahl von Gruppen teilbar ist, enthält die erste Gruppe vier Zeilen und die übrigen Gruppen jeweils drei Zeilen.
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
B. Aufteilen des Resultsets mithilfe von PARTITION BY
Im folgenden Beispiel wird das PARTITION BY
-Argument dem Code in Beispiel A hinzugefügt. Die Zeilen werden zunächst durch PostalCode
partitioniert und anschließend in jedem PostalCode
in vier Gruppen aufgeteilt. Beachten Sie, dass ORDER BY
in der OVER
-Klausel NTILE
sortiert und dass ORDER BY
der SELECT
-Anweisung das Resultset sortiert.
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
Siehe auch
Verweis
RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
Rangfolgefunktionen (Transact-SQL)
Funktionen (Transact-SQL)