SQL SERVER 排序函數
主題: |
SQL SERVER 排序函數 |
文章簡介: |
說明SQL SERVER 有哪些排序函數,並了解其用途 |
作者: |
沈蓓菁 |
版本/產出日期: |
V1.0/2016.11.17 |
1. 前言
SQL Server 2005新增幾個排序函數,當有需求要針對資料表的欄位進行排序,或指定查詢範圍時,可使用這些排序函數將資料進行排序。
2. 開始前準備
(1)實作是建立在SQL Server 2012 版本的環境
(2)建立資料表,執行以下SQL語法:
USE [Demo]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Products]
(
[ProductID] [int] NOT NULL,
[ProductName] [nvarchar](40) NOT NULL,
[Quantity] [smallint] NOT NULL,
[UnitPrice] [money] NOT NULL
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)
)
GO
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(100,'香蕉',100,10)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(101,'芭樂',200,15)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(102,'柳丁',200,15)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(103,'奇異果',100,20)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(104,'蘋果',100,25)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(105,'梨子',200,30)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(106,'草莓',300,33)
INSERT INTO [Products](ProductID,ProductName,Quantity,UnitPrice) VALUES(107,'櫻桃',500,40)
3. 實作說明
(1) ROW_NUMBER():
USE Demo
SELECT * ,ROW_NUMBER() OVER(ORDER BY UnitPrice) AS 單價排名
FROM Products
執行結果:當單價相同時,排序序號不會重覆
(2) Rank():
USE Demo
SELECT * ,RANK() OVER(ORDER BY UnitPrice) AS 單價排名
FROM Products
執行結果:當單價相同時,排序序號會重覆,但若有兩個排序為2的,下一個
排序是從4開始
(3) DENSE_RANK():
USE Demo
SELECT * ,DENSE_RANK() OVER(ORDER BY UnitPrice) AS 單價排名
FROM Products
執行結果:當單價相同時,排序序號會重覆,但若有兩個排序為2的,下一個排
序則從3開始
(4) NTitle(N)
USE Demo
SELECT * ,NTILE(4) OVER(ORDER BY UnitPrice) AS 單價排名
FROM Products
執行結果:根據Products中的單價平均分成四等分
(5)排序函數除了可排序外,還可配合做指定範圍的查詢,例如查詢單價排名的第5
到8筆:
USE Demo;
WITH TEMP (產品編號,產品名稱,數量,單價,單價排名)
AS(
SELECT * ,ROW_NUMBER() OVER(ORDER BY UnitPrice) AS 單價排名
FROM Products
)
SELECT * FROM TEMP WHERE 單價排名 BETWEEN 5 AND 8
執行結果:
4. 結論
SQL Server 2005關於排序方面新增四個函數,分別如下:
排序函數 |
說明 |
Row_Number() |
排序序號有連續,序號不可並列 |
Rank() |
排序序號不連續,序號可並列 |
Dense_Rank() |
排序序號有連續,序號可並列 |
NTitle(N) |
先進行排序,再將結果分為N等分 |
5. 參考來源