V SQL Server, NTILE()
Funkce umožňuje rozdělit řádky v uspořádaném oddílu do zadaného počtu skupin. Skupiny jsou očíslovány od 1. Pro každý řádek NTILE()
vrátí číslo skupiny, do které řádek patří.
Při volání funkce jednoduše zadáte požadovaný počet skupin.
Syntaxe
Syntaxe vypadá takto:
NTILE (integer_expression) OVER ( [] )
integer_expression je kladné celé číslo, které určuje počet skupin, do kterých musí být každý oddíl rozdělen. Může být typu int nebo velký .
FROM
klauzule do oddílů, na které je funkce aplikována.
NTILE()
hodnoty jsou přiřazeny řádkům v oddílu. Celé číslo nemůže představovat sloupec, když je
Příklad 1 – Základní použití
Zde je základní příklad ukazující, jak tato funkce funguje:
VYBERTE hráče, skóre, NTILE(4) NAD (POŘADÍTE PODLE Skóre DESC) 'NTILE'FROM Scoreboard;
Výsledek:
+----------+---------+---------+| Hráč | Skóre | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Hoří | 1270 | 1 || Meg | 1030 | 2 || Marge | 990 | 2 || Líza | 710 | 3 || Ned | 666 | 3 || Apu | 350 | 4 || Homer | 1 | 4 |+----------+---------+---------+
V tomto případě existuje 8 výsledků a hodnota, kterou poskytnu NTILE()
je 4, takže hodnoty jsou rovnoměrně rozloženy do 4 skupin.
Příklad 2 – Změňte hodnotu NTILE
Zde je to, co se stane, když změním NTILE()
hodnotu na 3.
VYBERTE hráče, skóre, NTILE(3) NAD (POŘADÍTE PODLE Skóre DESC) 'NTILE'FROM Scoreboard;
Výsledek:
+----------+---------+---------+| Hráč | Skóre | NTILE ||----------+---------+---------|| Bart | 2010 | 1 || Hoří | 1270 | 1 || Meg | 1030 | 1 || Marge | 990 | 2 || Líza | 710 | 2 || Ned | 666 | 2 || Apu | 350 | 3 || Homer | 1 | 3 |+----------+---------+---------+
Výsledky jsou rozděleny do 3 skupin. Jak můžete očekávat, poslední skupina má pouze 2 řádky (ve srovnání se 3 u ostatních skupin).
Příklad 3 – Změna řazení
Přepínání mezi vzestupným a sestupným řazením obvykle vede k NTILE()
hodnoty aplikované na různé řádky.
VYBERTE hráče, skóre, NTILE(4) NAD (POŘADÍ PODLE Skóre DESC) 'NTILE Sestupně', NTILE(4) NAD (POŘADÍ PODLE Skóre ASC) 'NTILE Vzestupně'FROM ScoreboardORDER BY Score DESC;
Výsledek:
+----------+---------+--------------------+---- ----------------+| Hráč | Skóre | NTILE sestupně | NTILE Vzestupně ||----------+---------+--------------------+----- ----------------|| Bart | 2010 | 1 | 4 || Hoří | 1270 | 1 | 4 || Meg | 1030 | 2 | 3 || Marge | 990 | 2 | 3 || Líza | 710 | 3 | 2 || Ned | 666 | 3 | 2 || Apu | 350 | 4 | 1 || Homer | 1 | 4 | 1 |+----------+---------+--------------------+----- --------------+
To však bude záviset na počtu řádků ve výsledné sadě oproti počtu NTILE. Je zřejmé, že pokud NTILE()
hodnota je 1, pak nebude žádný rozdíl.
VYBERTE hráče, skóre, NTILE(1) NAD (POŘADÍ PODLE Skóre DESC) 'NTILE Sestupně', NTILE(1) NAD (POŘADÍ PODLE Skóre ASC) 'NTILE Vzestupně'FROM ScoreboardORDER BY Score DESC;
Výsledek:
+----------+---------+--------------------+---- ----------------+| Hráč | Skóre | NTILE sestupně | NTILE Vzestupně ||----------+---------+--------------------+----- ----------------|| Bart | 2010 | 1 | 1 || Hoří | 1270 | 1 | 1 || Meg | 1030 | 1 | 1 || Marge | 990 | 1 | 1 || Líza | 710 | 1 | 1 || Ned | 666 | 1 | 1 || Apu | 350 | 1 | 1 || Homer | 1 | 1 | 1 |+----------+---------+--------------------+----- --------------+
Totéž se stane, pokud sada výsledků obsahuje pouze jeden řádek, bez ohledu na NTILE()
hodnota:
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;Výsledek:
+----------+---------+--------------------+---- ----------------+| Hráč | Skóre | NTILE sestupně | NTILE Vzestupně ||----------+---------+--------------------+----- ----------------|| Bart | 2010 | 1 | 1 |+----------+---------+--------------------+----- --------------+Příklad 4 – Oddíly
Můžete použít
PARTITION BY
klauzule k rozdělení výsledků do oddílů. Když to uděláte,NTILE()
se aplikuje na každý oddíl.Příklad:
VYBERTE Název týmu, Hráč, Skóre, NTILE(2) PŘES (ODDĚLENÍ PODLE NÁZVU týmu SEŘADIT PODLE Skóre ASC) 'NTILE'FROM Scoreboard sINNER JOIN Team tON t.TeamId =s.TeamId;Výsledek:
+------------+----------+---------+------------ -------+| Název týmu | Hráč | Skóre | NTILE ||------------+----------+---------+-------------- ------|| Kříženci | Apu | 350 | 1 || Kříženci | Ned | 666 | 1 || Kříženci | Meg | 1030 | 2 || Kříženci | Hoří | 1270 | 2 || Simpsonovi | Homer | 1 | 1 || Simpsonovi | Líza | 710 | 1 || Simpsonovi | Marge | 990 | 2 || Simpsonovi | Bart | 2010 | 2 |+------------+----------+---------+-------------- ------+