1. 程式人生 > >ROW_NUMBER() OVER()函式用法;(分組,排序),partition by

ROW_NUMBER() OVER()函式用法;(分組,排序),partition by

1、row_number() over()排序功能:

(1) row_number() over()分組排序功能:

     在使用 row_number() over()函式時候,over()裡頭的分組以及排序的執行晚於 where group by  order by 的執行。

partition by 用於給結果集分組,如果沒有指定那麼它把整個結果集作為一個分組,它和聚合函式不同的地方在於它能夠返回一個分組中的多條記錄,而聚合函式一般只有一個反映統計值的記錄。

例如:employee,根據部門分組排序。

SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee   
--------------------------------------  
000010  A00 152750  1  
000110  A00 66500   2  
000120  A00 49250   3  
200010  A00 46500   4  
200120  A00 39250   5  
000020  B01 94250   1  
000030  C01 98250   1  
000130  C01 73800   2  

(2)對查詢結果進行排序:(無分組)

SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (ORDER BY salary desc) rank FROM employee   
--------------------------------------  
000010  A00 152750  1  
000030  C01 98250   2  
000070  D21 96170   3  
000020  B01 94250   4  
000090  E11 89750   5  
000100  E21 86150   6  
000050  E01 80175   7  
000130  C01 73800   8  
000060  D11 72250   9  

 row_number() over()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).

2、rank() over()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).

select workdept,salary,rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;  
------------------  
A00 39250   1  
A00 46500   2  
A00 49250   3  
A00 66500   4  
A00 152750  5  
B01 94250   1  
C01 68420   1  
C01 68420   1  
C01 73800   3  

3、dense_rank() over()是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重複值的 

select workdept,salary,dense_rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;  
------------------  
A00 39250   1  
A00 46500   2  
A00 49250   3  
A00 66500   4  
A00 152750  5  
B01 94250   1  
C01 68420   1  
C01 68420   1  
C01 73800   2  
C01 98250   3  

使用ROW_NUMBER刪除重複資料 
---假設表TAB中有a,b,c三列,可以使用下列語句刪除a,b,c都相同的重複行。

DELETE FROM (select year,
                    QUARTER,
                    RESULTS,
                    row_number() over(partition by YEAR, QUARTER, RESULTS order by YEAR, QUARTER, RESULTS) AS ROW_NO
               FROM SALE)
 WHERE ROW_NO > 1

相關推薦

ROW_NUMBER() OVER()函式用法;(分組排序partition by (轉)

1、row_number() over()排序功能: (1) row_number() over()分組排序功能:      在使用 row_number() over()函式時候,over()裡頭的分組以及排序的執行晚於 where group by  order

ROW_NUMBER() OVER()函式用法;(分組排序partition by

1、row_number() over()排序功能: (1) row_number() over()分組排序功能:      在使用 row_number() over()函式時候,over()裡頭的分組以及排序的執行晚於 where group by  order by 的執行。 partition

ROW_NUMBER() OVER()函數用法;(分組排序partition by

clas 去重 style als targe .cn html sdn body 排序去重1 https://www.cnblogs.com/alsf/p/6344197.html 排序去重2http://blog.csdn.net/ywl570717586/art

ROW_NUMBER() OVER()函式用法詳解 (分組排序 例子多

語法格式:row_number() over(partition by 分組列 order by 排序列 desc) row_number() over()分組排序功能: 在使用 row_number() over()函式時候,over()裡頭的分組以及排序的執行晚於 wher

ROW_NUMBER() OVER函式的基本用法

看到很多分組函式,今天看到ROW_NUMBER() OVER函式對這個函式功能不瞭解,基本沒有用過,詳細函式介紹:語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)簡單的說row_number()從1開始,為每一

【POJ - 1696】Space Ant (凸包最小極角排序

題幹: The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists traced down an ant-like creature in the planet

BZOJ--1045-- 糖果傳遞(中位數排序

題目連結 :BZOJ--1045-- 糖果傳遞 我們知道如果不頭尾相連的話 直接求一個字首和 答案為ans+=s[i] 不相連的話就是1 和n之間斷開 頭尾相連的話就是 在第k個人之間斷開 設A[i]為 a[i]-平均數的值 S[i] 表示字首和 第k個人斷開 A[k+1]   

PAT甲級1012 (結構體排序

題目 To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C – C Program

oracle listagg() 函式用法(參照例子

工作中經常遇到很多需求是這樣的,根據條件彙總某些欄位,比如公司有三個投資平臺,同一個客戶拿手機號在三個平臺都註冊了,但註冊過的使用者名稱不一樣,顯示的時候需要根據手機號顯示所有註冊過的名稱。(我用的是oracle資料庫) 1、原始資料是這樣的,如圖:     2、要求顯示成這樣,如

Oracle中的row_number()over()函式

最近要實現一個功能,頭疼了半天,最終使用這個函式解決了 問題: 一個年級表 一個學生表 實現效果: 實現sql: SELECT * FROM T_CLASS AA LE

Sql資料庫儲存過程傳值(傳遞資料表名列名sp_executesql函式的使用

遇到的專案需求是:對幾個不同的資料表和相應的欄位進行類似的操作,表的名稱和相關的列名可以作為儲存過程的引數傳遞,這樣可以使用遊標遍歷不同表格的不同的列,再使用相同函式求出返回值進行統一的處理。由於專案中表的資料龐大,關係複雜,此處做簡化處理,描述大致意思。(此處的資料庫是SQ

建立一個物件陣列內放5個學生的資料(學號成績用指向物件的指標做函式引數在max函式中找出5個學生中成績最高者並輸出其學號。

原始碼如下:主要注意友元函式的宣告 #include <iostream> #include <string> using namespace std; class Student { public:     Student(string n,flo

xpath 特殊用法 starts-with(string(.)的學習筆記

#-*-coding:utf8-*- from lxml import etree html1 = ''' <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-

Codeforces 3B.Lorry(貪心排序

明明是一道水題好麼。。。 題意是有兩種貨物,一種佔用1單位面積,另一種佔用2單位面積 每個貨物有對應的價值 現在有n個貨物,總面積為v,問如何能夠使所載貨物價值最大 很明顯的揹包問題 但是因為要列印路徑,感覺直接排序寫起來比較方便 我的思路是按不同面積排序,每次比較兩種情況

Oracle ROW_NUMBER() OVER()函式的實際場景使用

前言 最近開發的系統中有個線上諮詢功能。學生在前臺提交諮詢資訊,教師可以登入後臺回覆諮詢。該功能設計是直接使用一張表,使用是否開始標識該條記錄是否是諮詢的開始,然後使用一個會話id標識是屬於一次諮詢,根據建立時間排序,最後就像聊天一樣。 後來遇到一個需求,就

opencv中addWeighted()函式用法總結(05

還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:addWeighted()函式是將兩張相同大小,相同型別的圖片融合的函式。他可以實現圖片的特效,不多說了

!HDU 4311 最小曼哈頓距離-思維&卡時間-(橫縱座標分開算排序

題意:有n個點,求以這n個點中的某一點為起點,到各點的曼哈頓距離和最小是多少 分析: 暴力列舉又要超時,這種題一般都是考思維了,多半都是用技巧找到一個高效的方法。個人覺得這題跟上一篇文章的題是一個型別。這種思想要記住。 這題也是用“分治”,雖說題目要求的是曼哈頓距離,但是我

C語言sscanf函式用法總結(一 正則表示式

#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; void sscanf_te

opencv中namedWindow( )函式用法總結(02

還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:namedWindow()的功能就是新建一個顯示視窗。可以指定視窗的型別。 第二步,結果圖顯示:我

opencv中createTrackbar()函式用法總結(06

在opencv中滑動條是很方便的一個測試函式,我們可以不需要更改程式就可以更改變數的值來觀察效果。 還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:用