1. 程式人生 > >關於SQL的over partition by 開窗語句在分頁和統計中的使用總

關於SQL的over partition by 開窗語句在分頁和統計中的使用總

nio partition def 一個 select tab 統計 cte table

CREATE TABLE OrderInfo(
ID INT IDENTITY(1,1) PRIMARY KEY,
CustomerID INT NULL,
TotalMoney DECIMAL(18,2) NULL,
OrderStatus TINYINT NULL DEFAULT 0,
CreateTime DATETIME DEFAULT GETDATE() NOT NULL
)

INSERT INTO OrderInfo
(
CustomerID,
TotalMoney,
OrderStatus,
CreateTime
)
SELECT 1,100,1,‘2015-03-21‘ UNION ALL
SELECT 2,50,1,‘2015-03-22‘ UNION ALL
SELECT 1,300,1,‘2015-03-23‘ UNION ALL
SELECT 3,1000,3,‘2015-03-24‘ UNION ALL
SELECT 2,20,1,‘2015-03-24‘ UNION ALL
SELECT 5,50,4,‘2015-03-20‘ UNION ALL
SELECT 8,600,2,‘2015-03-21‘ UNION ALL
SELECT 6,80,1,‘2015-03-22‘ UNION ALL
SELECT 2,70,1,‘2015-03-23‘ UNION ALL
SELECT 1,40,0,‘2015-03-23‘ UNION ALL
SELECT 9,20,1,‘2015-03-20‘ UNION ALL
SELECT 10,100,1,‘2015-03-21‘ UNION ALL
SELECT 6,99,1,‘2015-03-24‘ UNION ALL
SELECT 4,78,2,‘2015-03-25‘ UNION ALL
SELECT 2,100,1,‘2015-03-24‘

/*
找出每個顧客第一次下單的時間及金額
*/
with cte as(
select *,ROW_NUMBER() over(partition by customerid order by createtime) rm from OrderInfo
)
select * from cte where rm=1 --select CustomerID,min(CreateTime) from OrderInfo group by CustomerID

/*
找出每個顧客金額最大的訂單金額
*/
with cte as(
select *,ROW_NUMBER() over(partition by customerid order by totalmoney desc) rm from OrderInfo
)
select * from cte where rm=1 ---select CustomerID,max(TotalMoney) from OrderInfo group by CustomerID

/*
統計每一個客戶最近下的訂單是第幾次下的訂單
*/
with cte as
(
select *,ROW_NUMBER() over(partition by customerid order by createtime) rm from OrderInfo
)select CustomerID,max(rm) from cte
group by CustomerID ---select CustomerID,count(CustomerID) from OrderInfo group by CustomerID

/*
統計所有客戶第3次下單訂單信息
*/
;with cte as(
select *,ROW_NUMBER() over(partition by customerid order by createtime) rm from OrderInfo
)
select * from cte where rm=3

/*
統計每一個客戶所有訂單金額的平均值
*/
select *,avg(TotalMoney) over(partition by customerid) rm from OrderInfo

/*
在使用over等開窗函數時,over裏頭的分組及排序的執行晚於“where,group by,order by”的執行。
*/
SELECT CustomerID,CreateTime,ROW_NUMBER() OVER (PARTITION BY customerID ORDER BY CreateTime) AS num
FROM OrderInfo
WHERE CustomerID>2

關於SQL的over partition by 開窗語句在分頁和統計中的使用總