排序

SQL SERVER 排序函數

沈蓓菁 2016/11/18 09:09:55
784







主題

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. 參考來源

排序函數:ROW_NUMBER()、 RANK()與 DENSE_RANK()

T-SQL 2005新增的函數-1 ROW_NUMBER, RANK, DENSE_RANK, NTILE

沈蓓菁