久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQLServer中如何使用Partition By和row

144次閱讀
沒有評論

共計 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 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計3416字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 琼结县| 清河县| 六盘水市| 温宿县| 竹山县| 乌兰察布市| 武山县| 肃北| 丹寨县| 枣庄市| 大港区| 铁岭市| 临洮县| 郎溪县| 天全县| 郧西县| 清新县| 新沂市| 泌阳县| 神木县| 盐城市| 遂溪县| 宁明县| 克拉玛依市| 万源市| 三亚市| 新乡市| 定陶县| 九江县| 新沂市| 保定市| 洛川县| 北流市| 古丈县| 永新县| 沙田区| 天水市| 六盘水市| 崇义县| 新晃| 望江县|