W SQL Server, NTILE()
funkcja umożliwia podział wierszy w uporządkowanej partycji na określoną liczbę grup. Grupy są ponumerowane, zaczynając od 1. Dla każdego wiersza NTILE()
zwraca numer grupy, do której należy wiersz.
Wystarczy podać żądaną liczbę grup podczas wywoływania funkcji.
Składnia
Składnia wygląda tak:
NTILE (integer_expression) OVER ( [] < order_by_clause > )
integer_expression jest dodatnią liczbą całkowitą, która określa liczbę grup, na które musi zostać podzielona każda partycja. Może być typu int lub duży .
FROM
klauzuli na przegrody, do których funkcja jest stosowana.
NTILE()
wartości są przypisane do wierszy w partycji. Liczba całkowita nie może reprezentować kolumny, gdy
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład pokazujący, jak działa ta funkcja:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
Wynik:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 2 | | Marge | 990 | 2 | | Lisa | 710 | 3 | | Ned | 666 | 3 | | Apu | 350 | 4 | | Homer | 1 | 4 | +----------+---------+---------+
W tym przypadku jest 8 wyników i wartość, którą dostarczam do NTILE()
wynosi 4, więc wartości są równomiernie rozłożone na 4 grupy.
Przykład 2 – Zmień wartość NTILE
Oto, co się stanie, jeśli zmienię NTILE()
wartość na 3.
SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
Wynik:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 1 | | Marge | 990 | 2 | | Lisa | 710 | 2 | | Ned | 666 | 2 | | Apu | 350 | 3 | | Homer | 1 | 3 | +----------+---------+---------+
Wyniki są podzielone na 3 grupy. Jak można się spodziewać, ostatnia grupa ma tylko 2 rzędy (w porównaniu z 3 w innych grupach).
Przykład 3 – Zmiana kolejności
Przełączanie kolejności między rosnącą a malejącą zwykle skutkuje NTILE()
wartości stosowane do różnych wierszy.
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
Wynik:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 4 | | Burns | 1270 | 1 | 4 | | Meg | 1030 | 2 | 3 | | Marge | 990 | 2 | 3 | | Lisa | 710 | 3 | 2 | | Ned | 666 | 3 | 2 | | Apu | 350 | 4 | 1 | | Homer | 1 | 4 | 1 | +----------+---------+--------------------+-------------------+
Jednak będzie to zależeć od liczby wierszy w zestawie wyników w porównaniu z liczbą NTILE. Oczywiście, jeśli NTILE()
wartość wynosi 1, wtedy nie będzie różnicy.
SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
Wynik:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | | Burns | 1270 | 1 | 1 | | Meg | 1030 | 1 | 1 | | Marge | 990 | 1 | 1 | | Lisa | 710 | 1 | 1 | | Ned | 666 | 1 | 1 | | Apu | 350 | 1 | 1 | | Homer | 1 | 1 | 1 | +----------+---------+--------------------+-------------------+
To samo stanie się, jeśli zestaw wyników zawiera tylko jeden wiersz, niezależnie od NTILE()
wartość:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard WHERE Score > 2000 ORDER BY Score DESC;
Wynik:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | +----------+---------+--------------------+-------------------+
Przykład 4 – Partycje
Możesz użyć PARTITION BY
klauzula podziału wyników na partycje. Kiedy to zrobisz, NTILE()
jest stosowany do każdej partycji.
Przykład:
SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE' FROM Scoreboard s INNER JOIN Team t ON t.TeamId = s.TeamId;
Wynik:
+------------+----------+---------+-------------------+ | TeamName | Player | Score | NTILE | |------------+----------+---------+-------------------| | Mongrels | Apu | 350 | 1 | | Mongrels | Ned | 666 | 1 | | Mongrels | Meg | 1030 | 2 | | Mongrels | Burns | 1270 | 2 | | Simpsons | Homer | 1 | 1 | | Simpsons | Lisa | 710 | 1 | | Simpsons | Marge | 990 | 2 | | Simpsons | Bart | 2010 | 2 | +------------+----------+---------+-------------------+