Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak NTILE() działa w SQL Server

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 .

jest opcjonalne. Dzieli zestaw wyników utworzony przez FROM klauzuli na przegrody, do których funkcja jest stosowana.

jest wymagane. Określa kolejność, w jakiej NTILE() wartości są przypisane do wierszy w partycji. Liczba całkowita nie może reprezentować kolumny, gdy jest używany w funkcji rankingu.

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                 |
+------------+----------+---------+-------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja SUM() w SQL Server

  2. Jak zastąpić NULL inną wartością w SQL Server – ISNULL()

  3. Dołączanie tabel i schematów przy wyświetlaniu kolumn tożsamości w bazie danych SQL Server

  4. Jak naprawić „Wyrażenie ALTER TABLE SWITCH nie powiodło się”

  5. Żądanie nie powiodło się ze stanem HTTP 401:Unauthorized IN SSRS