sql >> Database >  >> RDS >> Sqlserver

Hoe NTILE() werkt in SQL Server

In SQL Server, de NTILE() functie stelt u in staat om de rijen in een geordende partitie in een gespecificeerd aantal groepen te verdelen. De groepen zijn genummerd, beginnend bij 1. Voor elke rij, NTILE() geeft het nummer van de groep waartoe de rij behoort.

U geeft eenvoudig het aantal gewenste groepen op wanneer u de functie aanroept.

Syntaxis

De syntaxis gaat als volgt:

NTILE (integer_expression) OVER ( [  ] < order_by_clause > )

integer_expression is een positieve integer-expressie die het aantal groepen specificeert waarin elke partitie moet worden verdeeld. Het kan van het type int . zijn , of groot .

is optioneel. Het verdeelt de resultatenset geproduceerd door de FROM clausule in partities waarop de functie wordt toegepast.

Is benodigd. Het bepaalt de volgorde waarin de NTILE() waarden worden toegewezen aan de rijen in een partitie. Een geheel getal kan geen kolom vertegenwoordigen wanneer de wordt gebruikt in een rangschikkingsfunctie.

Voorbeeld 1 – Basisgebruik

Hier is een eenvoudig voorbeeld dat laat zien hoe deze functie werkt:

SELECT 
  Player,
  Score,
  NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'
FROM Scoreboard;

Resultaat:

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

In dit geval zijn er 8 resultaten en de waarde die ik geef aan NTILE() is 4, dus de waarden zijn gelijkmatig verdeeld over 4 groepen.

Voorbeeld 2 – Verander de NTILE-waarde

Dit is wat er gebeurt als ik de NTILE() . verander waarde tot 3.

SELECT 
  Player,
  Score,
  NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'
FROM Scoreboard;

Resultaat:

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

De resultaten zijn verdeeld over 3 groepen. Zoals je zou verwachten, eindigt de laatste groep met slechts 2 rijen (vergeleken met 3 voor de andere groepen).

Voorbeeld 3 – Verander de volgorde

Het wisselen van volgorde tussen oplopend en aflopend resulteert meestal in de NTILE() waarden worden toegepast op verschillende rijen.

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;

Resultaat:

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

Dit hangt echter af van het aantal rijen in de resultatenset versus het aantal NTILE's. Het is duidelijk dat als de NTILE() waarde 1 is, dan is er geen verschil.

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;

Resultaat:

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

Hetzelfde zal gebeuren als de resultatenset slechts één rij bevat, ongeacht de NTILE() waarde:

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;

Resultaat:

+----------+---------+--------------------+-------------------+
| Player   | Score   | NTILE Descending   | NTILE Ascending   |
|----------+---------+--------------------+-------------------|
| Bart     | 2010    | 1                  | 1                 |
+----------+---------+--------------------+-------------------+

Voorbeeld 4 – Partities

U kunt de PARTITION BY . gebruiken clausule om de resultaten in partities te verdelen. Wanneer u dit doet, NTILE() wordt toegepast op elke partitie.

Voorbeeld:

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;

Resultaat:

+------------+----------+---------+-------------------+
| 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. WhoIsActive Runner

  2. Hoe het gemiddelde van een numerieke kolom in SQL te vinden

  3. Bereken het tijdsverschil tussen twee rijen

  4. Voorbeelden van het converteren van 'date' naar 'datetimeoffset' in SQL Server (T-SQL)