sql >> Databáze >  >> RDS >> Sqlserver

Jak NTILE() funguje v SQL Server

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ý .

je volitelný. Rozdělí výslednou sadu vytvořenou FROM klauzule do oddílů, na které je funkce aplikována.

je požadováno. Určuje pořadí, ve kterém NTILE() hodnoty jsou přiřazeny řádkům v oddílu. Celé číslo nemůže představovat sloupec, když je se používá ve funkci hodnocení.

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

  1. Oracle Partitioned Sequence

  2. Získejte název měsíce z data v PostgreSQL

  3. Jak šifrovat data v Oracle pomocí PL SQL

  4. Aktualizujte prohlášení s vnitřním spojením na Oracle