1. 程式人生 > >SQL奇技淫巧(01):給查出的資料排序編個號【row_number() over(order by c)】(mysql,db2,oracle,sqlserver通用)

SQL奇技淫巧(01):給查出的資料排序編個號【row_number() over(order by c)】(mysql,db2,oracle,sqlserver通用)

我們天天都在跟資料庫打交道,寫下的程式碼不計其數,寫下的SQL更是可以繞地球幾圈。這裡收集關於SQL的神奇語法及用法,雖然你可能沒有用過,但這些SQL卻可以在關鍵的時候,派上用場。

我對SQL語句的理解,可以比作一座橋樑,將零散的資料組合起來,拿到我所需要的有效資訊。也以此記錄一下使用心得

一. 語法及基礎用法

注意: row_number()不能單獨使用,需要和over(order by col)一起使用。

語法1:

row_number() over(ORDER BY col)

意思:簡單的說row_number()從1開始,為每一條分組記錄返回一個數字,這裡的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再為降序以後的每條xlh記錄返回一個序號。

語法2:

row_number() over(PARTITION BY col1 ORDER BY col2)

意思:表示根據col1分組,在分組內部根據 col2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)

關於Parttion by:

Parttion by關鍵字是SQL中分析性函式的一部分,用於給結果集進行分割槽。它和聚合函式Group by不同的地方在於它只是將原始資料進行名次排列,能夠返回一個分組中的多條記錄(記錄數不變),而Group by是對原始資料進行聚合統計,一般只有一條反映統計值的結果(每組返回一條)。

Parttion by 後面如果想按多個欄位分組,則以逗號分隔。

row_number()  over(PARTITION BY col1,col3,col4 ORDER BY col2)

例項:

(1) 建表造資料:

create table employee (empid int ,deptid int ,salary decimal(10,2));
insert into employee values(1,10,5500.00);
insert into employee values(2,10,4500.00);
insert into employee values(3,20,1900.00);
insert into employee values(4,20,4800.00);
insert into employee values(5,40,6500.00);
insert into employee values(6,40,14500.00);
insert into employee values(7,40,44500.00);
insert into employee values(8,50,6500.00);
insert into employee values(9,50,7500.00);

資料顯示為:

(2) 需求:根據部門分組,顯示每個部門的工資等級

sql:

SELECT  *, 
      row_number() over(PARTITION by deptid ORDER BY salary desc)  as score 
 FROM 
      employee

預期結果:

三. 真實案例

通過上面基礎語法和使用,我們也只是簡單地知道row_number()可以用來編號排序使用,以及分組內排序兩種情景。通過對其有一個瞭解之後,你的心中充滿疑問, 如果對於在專案中,我們又可以拿它來做什麼,又可以解決什麼樣的問題。

這個語法也是我最近工作內容的時候,才接觸到的,之前也只是模模糊糊地停留在知道有這個,而在工作中沒實際用過它。

上面介紹的是在單表中的一個操作,那麼對於稍微複雜的多表關聯操作是否有考慮過

下面舉個貼近身邊的例項來學習一下SQL用法:

左連線表中可能有多條資料滿足情況,但只取滿足條件中的第一條,即取max 自關聯的查詢資料

select 
      a.*, b.* 
from 
    girl g, 
    (select *, row_number() over(ORDER BY like desc) as rn from boy) b 
where b.rn = 1 and g.like = b.like

上面的意思:girl表和boy表關聯,讓girl找到最喜歡的那個boy;boy表是根據喜好值排序。

這樣就可以用上它了。

四. 總結

row_number()的用途非常廣泛,排序最好用它,它會為查詢出來的每一行記錄生成一個序號,依次排序且不會重複,注意使用row_number函式時必須要用over子句選擇對某一列進行排序才能生成序號。

同時,在使用排名函式的時候需要注意以下三點:

  • 1、排名函式必須有 OVER 子句。

  • 2、排名函式必須有包含 ORDER BY 的 OVER 子句。

  • 3、分組內從1開始排序。

這個方法的多資料庫相容性也是很好的,如果你要與資料庫打交道,也請收藏好它。

相關推薦

SQL01查出資料排序row_number() over(order by c)mysql,db2,oracle,sqlserver通用

我們天天都在跟資料庫打交道,寫下的程式碼不計其數,寫下的SQL更是可以繞地球幾圈。這裡收集關於SQL的神奇語法及用法,雖然你可能沒有用過,但這些SQL卻可以在關鍵的時候,派上用場。 我對SQL語句的理解,可以比作一座橋樑,將零散的資料組合起來,拿到我所需要的有效資訊。也以此記錄一下使用心得 一. 語法

C語言的積累

列印引數巨集 #define INPUT_CHECK(x) \ if ((x)) \ {

曹工說Spring Boot原始碼11-- context:component-scan,你真的會用嗎這次來說說它的

寫在前面的話 相關背景及資源: 曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享 曹工說Spring Boot原始碼(2)-- Bean Definition到底是什麼,咱們對著介面,逐個方法講解 曹工說Spring Boot原始碼(3)--

位運算的

位運算就是基於整數的二進位制表示進行的運算。由於計算機內部就是以二進位制來儲存資料,位運算是相當快的。 > 之前有總結過位運算的技巧,但稍微對[以前寫的文章](https://www.cnblogs.com/RioTian/p/12371164.html)不太滿意,所以重新總結一下 常用的運算子共 6 種

位運算的

學習之餘重新複習了下 [位運算的奇技淫巧(二)](https://www.cnblogs.com/RioTian/p/13598747.html) 又發現了幾個有趣的位運算,部分內容來自[東哥](https://labuladong.gitbook.io/algo/) 本文分兩部分,第一部分列舉幾個有趣的

」博客園頁面美化差不多是劃水

http 沒有 博客 -- erl text 頁面 ash spa 何為頁面美化?永遠沒有止境的亂搞也。 ——hzz 教材: 博客園美化

關於字符串和文件流的

童鞋 err pen spa 關於 文件大小 ood c_str 64bit 早早起來,發一篇來概括一下昨天晚上搞到深夜才學到的一些字符串和文件流的簡單操作。 (寫在前面:以下所有的文件流都以輸入文件流為例,另外這種文件讀寫方式與競賽時使用的有較大差別,NOIP黨裏C++剛

Mysql數據閃回的(binlog2sql)

mysql binlog2sql 一、概述binlog2sql是一個開源項目,應用於大眾點評線上環境。類似於ORACLE中的閃回功能,binlog2sql可以基於時間點或者位置偏移量進行數據恢復。從MySQL binlog解析出你要的SQL。根據不同選項,你可以得到原始SQL、回滾SQL、去除主鍵的I

CSS布局各種居中

設置 ybds orm 必須 解決 html prim 分享 post CSS布局奇技淫巧:各種居中 2017-08-23 無雙 前端開發 作者:無雙 鏈接:www.cnblogs.com/2050/p/3392803.html 居中是我們使用css來布局時常

黑暗中的生物利用快活生存

not 正在 ever reading 自己的 which cat 世界 round 今日導讀 如果讓你在伸手不見五指的黑暗當中生存,你能熬過幾天呢?而大千世界,無奇不有。在很多你不知道的角落,有些生物在完全黑暗的世界裏不僅活得相當快活,還進化出了各種令人瞠目結舌的驚奇技能

C#開發調試windows系統服務

選項 nbsp 調試 方法 href info bubuko 系統 .html 原文:C#開發奇技淫巧一:調試windows系統服務windows系統服務不能直接運行,只能在安裝完服務之後啟動、暫停、繼續、停止服務,導致服務的調試不能使用一般的斷點調試。 要調試系統服務,

C#開發根據dll文件加載C++或者Delphi插件

man int cnblogs 需要 pat method msg initial 函數指針 原文:C#開發奇技淫巧二:根據dll文件加載C++或者Delphi插件 這兩天忙著把框架改為支持加載C++和Delphi的插件,來不及更新blog了。 原來的

javascript 向下取整

mat asc floor math 轉化 java 目的 奇技淫巧 移位運算 let a=5/4|0 輸出a=1 利用了javascript在進行位運算前,先把浮點數轉化為整數的特性。 同理,也可以用移位運算,達到同樣目的 let a =5/4<

C

如果 %s def 完全 逆序 函數 遞歸實現 -s r+ 直接上代碼: (1).交換兩參數的值 #include <stdio.h>int main(){    int a = 10,b = 5;    a^=b^=a^=b;  

CF1063A Oh Those Palindromes

傳送門(當然上洛咕能搜到) 求指定字串最多回文子串個數 Ssy太強了... 學到一個新東西 就是如果一個字元有x個 那麼它能產生的最多的迴文串個數為C(x,2) 可以理解為選擇兩個字母作為邊界 然後發現 如果所有一樣的字母全都拼在一起 那麼總個數就是C(x,2) 所以答案就是一樣的放一起就OK

java的--意外行為與特性(譯文)

Java是一種非常成熟的程式語言 - 事實上,它已經走過21年了,如果它是一個人,它可以在美國隨便混!隨著年齡的增長,智慧也在增長,而至少有時候,有些東西會變得很怪異。在本文中,我將介Java語言的一些奇技淫巧的行為和特徵。 在這裡,沒有特別的順序去介紹一系列Java的奇技淫巧,僅供娛樂,或者你向朋友們推介

Noip前的大抱佛腳----

STL函式 set set查詢前驅後繼 multiset<int>::iterator iter; S.insert(x); iter=S.find(x);//返回迭代器 iter--;//前驅 int ans=*iter; S.erase(find(x)); return ans; 或者

那些

1.交換兩個變數的值。 分析:常用的做法是新增第三個變數來作為中介完成,這裡分享一個不太常用的做法: 變數為字串時: $a = "hello"; $b = "php"; list($a,$b) = array($b,$a); 或者: $a = $a.$b; $b = strlen(

Puppet的一些

puppet這個工具真的很神奇,先不說商業版有哪些黑科技,單是開源版本就有很多可能讓你摸不著頭腦的地方,下面來列舉一下puppet是怎麼查詢puppet server的 其實很簡單,puppet agent只要知道puppet是什麼就可以了,你可以將“puppet”寫在

Vue.js 你不知道的

自己先想一分鐘。       關於上面的面試題的具體解釋,請移步這裡,本文不在累述。正文開始,下面列舉的一些奇技淫巧有的或許你用過,有的或許你沒用過。不管有的沒的,希望你看完之後有所收穫吧。文筆和知識有限,不對的地方,請留言斧正! 給 prop