sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera en procentandel av en resultatuppsättning i SQL Server

I SQL Server kan du använda TOP klausul för att begränsa raderna som returneras från en fråga till en viss procentandel av resultatuppsättningen.

Du kan till exempel returnera de översta 10 % av resultaten, eller vilken procentandel du än behöver.

Exempel 1 – Hela resultatuppsättningen

Låt oss först returnera hela resultatuppsättningen:

SELECT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultat:

+-----------+--------------------------+
| AlbumId   | AlbumName                |
|-----------+--------------------------|
| 1         | Powerslave               |
| 2         | Powerage                 |
| 3         | Singing Down the Lane    |
| 4         | Ziltoid the Omniscient   |
| 5         | Casualties of Cool       |
| 6         | Epicloud                 |
| 7         | Somewhere in Time        |
| 8         | Piece of Mind            |
| 9         | Killers                  |
| 10        | No Prayer for the Dying  |
| 11        | No Sound Without Silence |
| 12        | Big Swing Face           |
| 13        | Blue Night               |
| 14        | Eternity                 |
| 15        | Scandinavia              |
| 16        | Long Lost Suitcase       |
| 17        | Praise and Blame         |
| 18        | Along Came Jones         |
| 19        | All Night Wrong          |
| 20        | The Sixteen Men of Tain  |
| 21        | Yo Wassup                |
| 22        | Busted                   |
+-----------+--------------------------+

Så det finns 22 rader i hela resultatuppsättningen.

Exempel 2 – Returnera topp 10 % av resultaten

Låt oss nu returnera de översta 10 procenten av dessa resultat:

SELECT TOP(10) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultat:

+-----------+-----------------------+
| AlbumId   | AlbumName             |
|-----------+-----------------------|
| 1         | Powerslave            |
| 2         | Powerage              |
| 3         | Singing Down the Lane |
+-----------+-----------------------+

I detta fall returneras tre rader.

Du kanske märker att 10 procent av 22 faktiskt är 2,2 (inte 3). Uppenbarligen kan SQL Server inte presentera 2,2 rader, så det avrundar resultaten uppåt.

Exempel 2 – Avrundning uppåt istället för nedåt

Om du undrar varför SQL Server inte avrundar resultaten nedåt närhelst bråkdelen är mindre än 5, ta en titt på följande exempel.

SELECT TOP(1) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultat:

+-----------+-------------+
| AlbumId   | AlbumName   |
|-----------+-------------|
| 1         | Powerslave  |
+-----------+-------------+

Kom ihåg att hela resultatuppsättningen hade 22 rader, så 1 procent av 22 rader skulle innebära att 0,22 rader skulle returneras.

Och det är just därför vi inte skulle vilja bli avrundade. Om 0,22 rader avrundas nedåt, skulle inga rader returneras, vilket leder till felaktigt slutsatsen att det inte fanns några matchningar för vår fråga.

Exempel 3 – Noll procent

Som du kanske förväntar dig, kommer användning av 0 procent att returnera noll rader.

SELECT TOP(0) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultat:

(0 rows affected)

Exempel 4 – Maximal procentandel

Du kan bara ange procentvärden mellan 0 och 100.

Här är ett exempel på hur du försöker använda ett värde högre än 100:

SELECT TOP(120) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultat:

Msg 1031, Level 15, State 1, Line 2
Percent values must be between 0 and 100.

Exempel 5 – Negativa procentsatser

Som nämnts måste procentvärden vara mellan 0 och 100, så du får ett felmeddelande om du anger en negativ procentsats.

SELECT TOP(-10) PERCENT
  AlbumId,
  AlbumName 
FROM Albums
ORDER BY AlbumId;

Resultat:

Msg 1031, Level 15, State 1, Line 3
Percent values must be between 0 and 100.

  1. CONSTRAINT för att kontrollera värden från en fjärrrelaterade tabell (via join etc.)

  2. Hur man visar sorteringen av en kolumn i MySQL

  3. ClusterControl - Advanced Backup Management - mariabackup del II

  4. CTE-fel:Typerna matchar inte mellan ankaret och den rekursiva delen