日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能

發(fā)布時間:2023/12/3 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • Oracle 的分組排序
  • MySQL 的分組排序
    • 分析需求
    • 創(chuàng)建模擬數(shù)據(jù)
    • SQL 實現(xiàn)
    • 結(jié)果演示

Oracle 的分組排序

Oracle 的分組排序函數(shù)的語法格式如下:

ROW_NUMBER() OVER([PARTITION BY column_1, column_2,][ORDER BY column_3,column_4,] )

說明:表示根據(jù) column_1, column_2,... 分組,在分組內(nèi)部根據(jù)再根據(jù) column_3,column_4,... 排序。

例如有下面這張員工表:

DROP TABLE IF EXISTS employee;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);

執(zhí)行下面的分組排序語句:

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROMemployee;

得到的查詢結(jié)果如下:

MySQL 的分組排序

由于 MySQL 沒有提供類似 Oracle 中的類似 OVER() 這樣豐富的分析函數(shù),所以在 MySQL 里需要實現(xiàn)這樣的功能,我們只能用一些靈活的辦法。

分析需求

根據(jù)部門來分組,顯示各員工在部門里按薪水排名名次。

顯示結(jié)果預(yù)期如下:

+——-+——–+———-+——+ | empid | deptid | salary | rank | +——-+——–+———-+——+ | 1 | 10 | 5500.00 | 1 | | 2 | 10 | 4500.00 | 2 | | 4 | 20 | 4800.00 | 1 | | 3 | 20 | 1900.00 | 2 | | 7 | 40 | 44500.00 | 1 | | 6 | 40 | 14500.00 | 2 | | 5 | 40 | 6500.00 | 3 | | 9 | 50 | 7500.00 | 1 | | 8 | 50 | 6500.00 | 2 | +——-+——–+———-+——+

創(chuàng)建模擬數(shù)據(jù)

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

SQL 實現(xiàn)

SELECTempid,deptid,salary,rank, rownum FROM(SELECTemployee_tmp.empid,employee_tmp.deptid,employee_tmp.salary,@rownum := @rownum + 1 as rownum,IF( @pdept = employee_tmp.deptid, @rank := @rank + 1, @rank := 1 ) AS rank,@pdept := employee_tmp.deptid FROM( SELECT empid, deptid, salary FROM employee ORDER BY deptid ASC, -- 按部門升序salary DESC -- 按工資降序) employee_tmp,( SELECT @rownum := 0, -- 聲明定義用戶變量rownum@pdept := NULL, -- 聲明定義用戶變量pdept@rank := 0 -- 聲明定義用戶變量rank) a ) result;

執(zhí)行結(jié)果如下:

上述語句可以改成:

SET @ROW = 0; -- 聲明定義用戶變量row SET @pdept = ''; -- 聲明定義用戶變量pdept SET @rownum = 0; -- 聲明定義用戶變量rownumSELECTa.empid,a.deptid,a.salary,a.rank,a.rownum FROM(SELECTempid,deptid,salary,@rownum := @rownum + 1 AS rownum,CASEWHEN @pdept = deptid THEN@ROW := @ROW + 1 ELSE @ROW := 1 END rank,@pdept := deptid FROMemployee ORDER BYdeptid,salary DESC ) a

結(jié)果演示

MySQL > select empid,deptid,salary,rank from (-> select employee_tmp.empid,employee_tmp.deptid,employee_tmp.salary,@rownum:=@rownum+1 ,-> if(@pdept=employee_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,-> @pdept:=employee_tmp.deptid-> from (-> select empid,deptid,salary from employee order by deptid asc ,salary desc-> ) employee_tmp ,(select @rownum :=0 , @pdept := null ,@rank:=0) a ) result-> ; +——-+——–+———-+——+ | empid | deptid | salary | rank | +——-+——–+———-+——+ | 1 | 10 | 5500.00 | 1 | | 2 | 10 | 4500.00 | 2 | | 4 | 20 | 4800.00 | 1 | | 3 | 20 | 1900.00 | 2 | | 7 | 40 | 44500.00 | 1 | | 6 | 40 | 14500.00 | 2 | | 5 | 40 | 6500.00 | 3 | | 9 | 50 | 7500.00 | 1 | | 8 | 50 | 6500.00 | 2 | +——-+——–+———-+——+ 9 rows in set (0.00 sec)

總結(jié)

以上是生活随笔為你收集整理的MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。