Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как NTILE() работи в SQL Server

В SQL Server, NTILE() функцията ви позволява да разпределите редовете в подреден дял в определен брой групи. Групите са номерирани, започвайки от 1. За всеки ред, NTILE() връща номера на групата, към която принадлежи редът.

Просто предоставяте желания брой групи, когато извиквате функцията.

Синтаксис

Синтаксисът е така:

NTILE (целочислен_израз) НАД ( [  ]  )

целочислен_израз е положителен целочислен израз, който определя броя на групите, на които всеки дял трябва да бъде разделен. Може да бъде от тип int , или голям .

е по избор. Той разделя резултатния набор, произведен от FROM клауза в дялове, към които се прилага функцията.

изисква се. Той определя реда, в който NTILE() стойностите се присвояват на редовете в дял. Цяло число не може да представлява колона, когато се използва във функция за класиране.

Пример 1 – Основна употреба

Ето основен пример, показващ как работи тази функция:

ИЗБЕРЕТЕ играч, резултат, NTILE(4) НАД (ПОРЪЧКА ПО ДЕСЦ НА Резултат) 'NTILE' ОТ таблото;

Резултат:

+---------+---------+--------+| Играч | Резултат | NTILE ||----------+--------+--------|| Барт | 2010 г. | 1 || Изгаряния | 1270 | 1 || Мег | 1030 | 2 || Мардж | 990 | 2 || Лиза | 710 | 3 || Нед | 666 | 3 || Apu | 350 | 4 || Омир | 1 | 4 |+---------+--------+--------+

В този случай има 8 резултата и стойността, която предоставям на NTILE() е 4, така че стойностите са равномерно разпределени в 4 групи.

Пример 2 – Промяна на стойността NTILE

Ето какво се случва, ако променя NTILE() стойност до 3.

ИЗБЕРЕТЕ играч, резултат, NTILE(3) НАД (ПОРЕД ПО ДЕСЦ.) 'NTILE'ОТ таблото;

Резултат:

+---------+---------+--------+| Играч | Резултат | NTILE ||----------+--------+--------|| Барт | 2010 г. | 1 || Изгаряния | 1270 | 1 || Мег | 1030 | 1 || Мардж | 990 | 2 || Лиза | 710 | 2 || Нед | 666 | 2 || Apu | 350 | 3 || Омир | 1 | 3 |+---------+--------+--------+

Резултатите са разпределени в 3 групи. Както може да очаквате, последната група завършва само с 2 реда (в сравнение с 3 за другите групи).

Пример 3 – Превключване на подреждането

Превключването на подредбата между възходящо и низходящо обикновено води до NTILE() стойности се прилагат към различни редове.

ИЗБЕРЕТЕ играч, резултат, NTILE(4) НАД (ПОРЪЧКА ПО ДЕСЦ.) 'NTILE Низходяща', NTILE(4) НАД (ПОРЕД ПО Резултат ASC) 'NTILE Възходяща' ОТ ScoreboardORDER BY Score DESC;

Резултат:

+----------+---------+--------------------+---- ---------------+| Играч | Резултат | NTILE Низходящ | NTILE Възходящ ||----------+--------+--------------------+---- ---------------|| Барт | 2010 г. | 1 | 4 || Изгаряния | 1270 | 1 | 4 || Мег | 1030 | 2 | 3 || Мардж | 990 | 2 | 3 || Лиза | 710 | 3 | 2 || Нед | 666 | 3 | 2 || Apu | 350 | 4 | 1 || Омир | 1 | 4 | 1 |+---------+--------+------------+----- --------------+

Това обаче ще зависи от това колко реда са в резултатния набор спрямо броя на NTILE. Очевидно, ако NTILE() стойността е 1, тогава няма да има разлика.

ИЗБЕРЕТЕ играч, резултат, NTILE(1) НАД (ПОРЪЧКА ПО ДЕСЦ.) 'NTILE Низходяща', NTILE(1) НАД (ПОРЕД ПО Резултат ASC) 'NTILE Възходяща' ОТ Таблото ПОРЪЧВАНЕ ПО Резултати DESC;

Резултат:

+----------+---------+--------------------+---- ---------------+| Играч | Резултат | NTILE Низходящ | NTILE Възходящ ||----------+--------+--------------------+---- ---------------|| Барт | 2010 г. | 1 | 1 || Изгаряния | 1270 | 1 | 1 || Мег | 1030 | 1 | 1 || Мардж | 990 | 1 | 1 || Лиза | 710 | 1 | 1 || Нед | 666 | 1 | 1 || Apu | 350 | 1 | 1 || Омир | 1 | 1 | 1 |+---------+--------+------------+----- --------------+

Същото нещо ще се случи, ако резултатният набор съдържа само един ред, независимо от NTILE() стойност:

ИЗБЕРЕТЕ играч, резултат, NTILE(4) НАД (ПОРЪЧКА ПО ДЕСЦ.) 'NTILE Низходяща', NTILE(4) НАД (ПОРЪЧКА ПО Резултат ASC) 'NTILE Възходяща' ОТ ScoreboardWHERE Резултат> 2000 ПОРЪЧКА ПО Резултати DESC; 

Резултат:

+----------+---------+--------------------+---- ---------------+| Играч | Резултат | NTILE Низходящ | NTILE Възходящ ||----------+--------+--------------------+---- ---------------|| Барт | 2010 г. | 1 | 1 |+---------+--------+------------+----- --------------+

Пример 4 – Дялове

Можете да използвате PARTITION BY клауза за разделяне на резултатите на дялове. Когато направите това, NTILE() се прилага към всеки дял.

Пример:

ИЗБЕРЕТЕ Име на отбор, Играч, Резултат, NTILE(2) НАД (РАЗДЕЛЯНЕ ПО Име на отбор ПОРЪЧКА ПО Резултат ASC) 'NTILE'ОТ Scoreboard SINNER ПРИСЪЕДИНЕТЕ се към отбор tON t.TeamId =s.TeamId;

Резултат:

+------------+-----------+--------+------------ -------+| Име на екип | Играч | Резултат | NTILE ||------------+----------+---------+------------ ------|| Мелези | Apu | 350 | 1 || Мелези | Нед | 666 | 1 || Мелези | Мег | 1030 | 2 || Мелези | Изгаряния | 1270 | 2 || Симпсън | Омир | 1 | 1 || Симпсън | Лиза | 710 | 1 || Симпсън | Мардж | 990 | 2 || Симпсън | Барт | 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. Форматиране на числа чрез запълване с водещи нули в SQL Server

  2. Основи и използване на NOLOCK намек в SQL Server

  3. Как да използвате логиката IF...THEN в SQL Server

  4. Какъв е еквивалентът на 'describe table' в SQL Server?

  5. Защо моята ODBC връзка се проваля при стартиране на SSIS натоварване във Visual Studio, но не и при изпълнение на същия пакет с помощта на Execute Package Utility