共計 3416 個字符,預計需要花費 9 分鐘才能閱讀完成。
行業資訊
數據庫
SQLServer 中如何使用 Partition By 和 row_number 函數
這期內容當中丸趣 TV 小編將會給大家帶來有關 SQLServer 中如何使用 Partition By 和 row_number 函數,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
首先呢我把表中的數據按照提交時間倒序出來:
“corp_name”就是分類的 GUID(請原諒我命名的隨意性)。OK,這里按照最開始的想法加上 Group By 來看一下顯示效果:
呃,嗯。這尼瑪和想象中的結果不一樣啊,看來寫代碼還是要理性分析問題,意念是無法控制結果滴!
既然要求是不同分類的數據,除了使用 Group By 之外,還有別的函數能用嗎?度娘了一下結果還真有,over(partition by)函數,那么它和平時用的 Group By 有什么區別呢?Group By 除了對結果進行單純的分組之外呢,一般都和聚合函數一起使用,Partition By 也具有分組功能,屬于 Oracle 的分析函數,在這里就不詳細的不啦不啦不啦了。
看代碼:
over(partition by corp_name order by submit_time desc) as t。就是按照 corp_name 分類并按時間倒序出來,t 這里一列呢就是不同 corp_name 類出現的次數,需求是只查詢出不同分類的最新提交數據,那么我們只需要針對 t 再進行一次篩選即可:
好啦,結果已經出來,不求各位看官喜歡,但求看在我頭像中的胸器望點個贊,好人一生平安哦!!!
ps:SQL Server 數據庫 partition by 與 ROW_NUMBER() 函數使用詳解
關于 SQL 的 partition by 字段的一些用法心得
先看例子:
if object_id(TESTDB) is not null drop table TESTDBcreate table TESTDB(A varchar(8), B varchar(8))insert into TESTDBselect A1 , B1 union allselect A1 , B2 union allselect A1 , B3 union allselect A2 , B4 union allselect A2 , B5 union allselect A2 , B6 union allselect A3 , B7 union allselect A3 , B3 union allselect A3 , B4
— 所有的信息
SELECT * FROM TESTDBA B-------A1 B1A1 B2A1 B3A2 B4A2 B5A2 B6A3 B7A3 B3A3 B4
— 使用 PARTITION BY 函數后
SELECT *,ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) NUM FROM TESTDBA B NUM-------------A1 B1 1A1 B2 2A1 B3 3A2 B4 1A2 B5 2A2 B6 3A3 B7 1A3 B3 2A3 B4 3
可以看到結果中多出一列 NUM 這個 NUM 就是說明了相同行的個數,比如 A1 有 3 個,他就給每個 A1 標上是第幾個。
— 僅僅使用 ROW_NUMBER() OVER 的結果
SELECT *,ROW_NUMBER() OVER(ORDER BY A DESC)NUM FROM TESTDB A B NUM------------------------A3 B7 1A3 B3 2A3 B4 3A2 B4 4A2 B5 5A2 B6 6A1 B1 7A1 B2 8A1 B3 9
可以看到它只是單純標出了行號。
— 深入一點應用
SELECT A = CASE WHEN NUM = 1 THEN A ELSE END,BFROM (SELECT A,NUM = ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) FROM TESTDB) TA B---------A1 B1 B2 B3A2 B4 B5 B6A3 B7 B3 B4
接下來我們就通過幾個實例來一一介紹 ROW_NUMBER() 函數的使用。
實例如下:
1. 使用 row_number()函數進行編號,如
select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer
原理:先按 psd 進行排序,排序完后,給每條數據進行編號。
2. 在訂單中按價格的升序進行排序,并給每條記錄進行排序代碼如下:
select DID,customerID,totalPrice,ROW_NUMBER() over(order by totalPrice) as rows from OP_Order
3. 統計出每一個各戶的所有訂單并按每一個客戶下的訂單的金額 升序排序,同時給每一個客戶的訂單進行編號。這樣就知道每個客戶下幾單了。
如圖:
代碼如下:
select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order
4. 統計每一個客戶最近下的訂單是第幾次下的訂單。
代碼如下:
with tabs as ( select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order ) select MAX(rows) as 下單次數 ,customerID from tabs group by customerID
5. 統計每一個客戶所有的訂單中購買的金額最小,而且并統計改訂單中,客戶是第幾次購買的。
如圖:
上圖:rows 表示客戶是第幾次購買。
思路:利用臨時表來執行這一操作。
1. 先按客戶進行分組,然后按客戶的下單的時間進行排序,并進行編號。
2. 然后利用子查詢查找出每一個客戶購買時的最小價格。
3. 根據查找出每一個客戶的最小價格來查找相應的記錄。
代碼如下:
with tabs as ( select ROW_NUMBER() over(partition by customerID order by insDT) as rows,customerID,totalPrice, DID from OP_Order ) select * from tabs where totalPrice in ( select MIN(totalPrice)from tabs group by customerID )
6. 篩選出客戶第一次下的訂單。
思路。利用 rows= 1 來查詢客戶第一次下的訂單記錄。
代碼如下:
with tabs as ( select ROW_NUMBER() over(partition by customerID order by insDT) as rows,* from OP_Order ) select * from tabs where rows = 1 select * from OP_Order
7.rows_number() 可用于分頁
思路:先把所有的產品篩選出來,然后對這些產品進行編號。然后在 where 子句中進行過濾。
8. 注意:在使用 over 等開窗函數時,over 里頭的分組及排序的執行晚于“where,group by,order by”的執行。
如下代碼:
select ROW_NUMBER() over(partition by customerID order by insDT) as rows, customerID,totalPrice, DID from OP_Order where insDT 2011-07-22
上述就是丸趣 TV 小編為大家分享的 SQLServer 中如何使用 Partition By 和 row_number 函數了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。