sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fungerer NTILE() i SQL Server

I SQL Server er NTILE() funktionen giver dig mulighed for at fordele rækkerne i en ordnet partition i et bestemt antal grupper. Grupperne er nummererede, startende ved 1. For hver række, NTILE() returnerer nummeret på den gruppe, som rækken tilhører.

Du angiver blot det antal grupper, du ønsker, når du kalder funktionen.

Syntaks

Syntaksen ser sådan ud:

NTILE (integer_expression) OVER ( [  ]  )

heltalsudtryk er et positivt heltalsudtryk, der angiver antallet af grupper, som hver partition skal opdeles i. Det kan være af typen int eller bigt .

er valgfri. Den deler resultatsættet produceret af FROM klausul i partitioner, som funktionen anvendes på.

er påkrævet. Det bestemmer rækkefølgen i NTILE() værdier tildeles til rækkerne i en partition. Et heltal kan ikke repræsentere en kolonne, når bruges i en rangeringsfunktion.

Eksempel 1 – Grundlæggende brug

Her er et grundlæggende eksempel, der viser, hvordan denne funktion fungerer:

VÆLG Spiller, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'FRA Scoreboard;

Resultat:

+----------+--------+---------+| Spiller | Score | NTILE ||--------+---------+---------|| Bart | 2010 | 1 || Brænder | 1270 | 1 || Meg | 1030 | 2 || Marge | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || Apu | 350 | 4 || Homer | 1 | 4 |+-----------+--------+---------+

I dette tilfælde er der 8 resultater og den værdi, jeg giver til NTILE() er 4, så værdierne er jævnt fordelt på 4 grupper.

Eksempel 2 – Skift NTILE-værdien

Her er, hvad der sker, hvis jeg ændrer NTILE() værdi til 3.

VÆLG Spiller, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'FRA Scoreboard;

Resultat:

+----------+--------+---------+| Spiller | Score | NTILE ||--------+---------+---------|| Bart | 2010 | 1 || Brænder | 1270 | 1 || Meg | 1030 | 1 || Marge | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || Apu | 350 | 3 || Homer | 1 | 3 |+-----------+--------+---------+

Resultaterne er fordelt på 3 grupper. Som du kunne forvente, ender den sidste gruppe med kun 2 rækker (sammenlignet med 3 for de andre grupper).

Eksempel 3 – Skift bestilling

Skift af rækkefølgen mellem stigende og faldende vil normalt resultere i NTILE() værdier, der anvendes på forskellige rækker.

VÆLG Spiller, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FRA ScoreboardORDER BY Score DESC;

Resultat:

+-------------------------- ---------------+| Spiller | Score | NTILE Faldende | NTILE Stigende ||--------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 4 || Brænder | 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 |+-----------+---------+--------------------+----- --------------+

Dette vil dog afhænge af, hvor mange rækker der er i resultatsættet kontra antallet af NTILE'er. Det er klart, hvis NTILE() værdien er 1, så er der ingen forskel.

VÆLG Spiller, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FRA ScoreboardORDER BY Score DESC;

Resultat:

+-------------------------- ---------------+| Spiller | Score | NTILE Faldende | NTILE Stigende ||--------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 || Brænder | 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 |+-----------+---------+--------------------+----- --------------+

Det samme vil ske, hvis resultatsættet kun indeholder én række, uanset NTILE() værdi:

VÆLG Spiller, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FRA ScoreboardWHERE Score> 2000ORDER BY Score DESC; 

Resultat:

+-------------------------- ---------------+| Spiller | Score | NTILE Faldende | NTILE Stigende ||--------+---------+--------------------+---- ---------------|| Bart | 2010 | 1 | 1 |+-----------+---------+--------------------+----- --------------+

Eksempel 4 – Partitioner

Du kan bruge PARTITION BY klausul for at opdele resultaterne i partitioner. Når du gør dette, NTILE() anvendes mod hver partition.

Eksempel:

VÆLG Holdnavn, Spiller, Score, NTILE(2) OVER (OPDELING EFTER Holdnavn ORDEN EFTER Score ASC) 'NTILE'FRA Scoreboard SINNER JOIN Team tON t.TeamId =s.TeamId;

Resultat:

+------------+-----------+--------+------------ -------+| Holdnavn | Spiller | Score | NTILE ||-------------------------------- ------|| Mongreler | Apu | 350 | 1 || Mongreler | Ned | 666 | 1 || Mongreler | Meg | 1030 | 2 || Mongreler | Brænder | 1270 | 2 || Simpsons | Homer | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Marge | 990 | 2 || Simpsons | Bart | 2010 | 2 |+--------------------------- ------+

  1. Sådan fungerer ELT() i MariaDB

  2. Sekvenser ikke påvirket af transaktioner?

  3. konvertering af en varchar-datatype til en datetime-datatype resulterede i en værdi uden for området

  4. 2 måder at tilføje førende nuller i PostgreSQL