Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von NTILE() in SQL Server

In SQL Server die NTILE() Mit dieser Funktion können Sie die Zeilen in einer geordneten Partition in eine bestimmte Anzahl von Gruppen verteilen. Die Gruppen sind nummeriert, beginnend bei 1. Für jede Zeile NTILE() gibt die Nummer der Gruppe zurück, zu der die Zeile gehört.

Beim Aufruf der Funktion geben Sie einfach die gewünschte Anzahl an Gruppen an.

Syntax

Die Syntax lautet wie folgt:

NTILE (integer_expression) OVER ( [  ]  )

Ganzzahl_Ausdruck ist ein positiver ganzzahliger Ausdruck, der die Anzahl der Gruppen angibt, in die jede Partition unterteilt werden muss. Es kann vom Typ int sein , oder bigint .

es ist optional. Es teilt die von FROM erzeugte Ergebnismenge -Klausel in Partitionen, auf die die Funktion angewendet wird.

erforderlich. Es bestimmt die Reihenfolge, in der NTILE() Werte werden den Zeilen in einer Partition zugewiesen. Eine Ganzzahl kann keine Spalte darstellen, wenn wird in einer Ranking-Funktion verwendet.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein einfaches Beispiel, das zeigt, wie diese Funktion funktioniert:

SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'FROM Scoreboard;

Ergebnis:

+----------+---------+---------+| Spieler | Ergebnis | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Verbrennungen | 1270 | 1 || Mega | 1030 | 2 || Marge | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || APU | 350 | 4 || Homer | 1 | 4 |+----------+---------+---------+

In diesem Fall gibt es 8 Ergebnisse und den Wert, den ich an NTILE() gebe ist 4, also verteilen sich die Werte gleichmäßig auf 4 Gruppen.

Beispiel 2 – NTILE-Wert ändern

Folgendes passiert, wenn ich NTILE() ändere Wert auf 3.

SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'FROM Scoreboard;

Ergebnis:

+----------+---------+---------+| Spieler | Ergebnis | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Verbrennungen | 1270 | 1 || Mega | 1030 | 1 || Marge | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || APU | 350 | 3 || Homer | 1 | 3 |+----------+---------+---------+

Die Ergebnisse verteilen sich auf 3 Gruppen. Wie zu erwarten, hat die letzte Gruppe nur 2 Zeilen (im Vergleich zu 3 für die anderen Gruppen).

Beispiel 3 – Ändern Sie die Reihenfolge

Das Umschalten der Reihenfolge zwischen aufsteigend und absteigend führt normalerweise zu NTILE() Werte, die auf verschiedene Zeilen angewendet werden.

SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;

Ergebnis:

+----------+---------+--------------------+---- ---------------+| Spieler | Ergebnis | NTILE Absteigend | NTILE Aufsteigend ||----------+-----------------+--------------------+---- ---------------|| Bart | 2010 | 1 | 4 || Verbrennungen | 1270 | 1 | 4 || Mega | 1030 | 2 | 3 || Marge | 990 | 2 | 3 || Lisa | 710 | 3 | 2 || Ned | 666 | 3 | 2 || APU | 350 | 4 | 1 || Homer | 1 | 4 | 1 |+----------+---------+--------------------+----- --------------+

Dies hängt jedoch davon ab, wie viele Zeilen sich in der Ergebnismenge im Vergleich zur Anzahl der NTILEs befinden. Offensichtlich, wenn die NTILE() Wert 1 ist, dann gibt es keinen Unterschied.

SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;

Ergebnis:

+----------+---------+--------------------+---- ---------------+| Spieler | Ergebnis | NTILE Absteigend | NTILE Aufsteigend ||----------+-----------------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 || Verbrennungen | 1270 | 1 | 1 || Mega | 1030 | 1 | 1 || Marge | 990 | 1 | 1 || Lisa | 710 | 1 | 1 || Ned | 666 | 1 | 1 || APU | 350 | 1 | 1 || Homer | 1 | 1 | 1 |+----------+---------+--------------------+----- --------------+

Das Gleiche passiert, wenn die Ergebnismenge nur eine Zeile enthält, unabhängig von NTILE() Wert:

SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardWHERE Score> 2000ORDER BY Score DESC; 

Ergebnis:

+----------+---------+--------------------+---- ---------------+| Spieler | Ergebnis | NTILE Absteigend | NTILE Aufsteigend ||----------+-----------------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 |+----------+---------+--------------------+----- --------------+

Beispiel 4 – Partitionen

Sie können den PARTITION BY verwenden -Klausel, um die Ergebnisse in Partitionen aufzuteilen. Wenn Sie dies tun, NTILE() wird auf jede Partition angewendet.

Beispiel:

SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE'FROM Scoreboard sINNER JOIN Team tON t.TeamId =s.TeamId;

Ergebnis:

+------------+----------+---------+------------ -------+| Teamname | Spieler | Ergebnis | NTILE ||----+----------+---------+------------- ------|| Mischlinge | APU | 350 | 1 || Mischlinge | Ned | 666 | 1 || Mischlinge | Mega | 1030 | 2 || Mischlinge | Verbrennungen | 1270 | 2 || Simpsons | Homer | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Marge | 990 | 2 || Simpsons | Bart | 2010 | 2 |+------------+----------+---------+------------ ------+