MYSQL-實現ORACLE- row_number() over(partition by ) 分組排序功能.
1.首先我們來建立例項資料:
drop table if exists heyf_t10;
create table heyf_t10 (empid int ,deptid int ,salary decimal(10,2) );
insert into heyf_t10 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);
2. 確定需求: 根據部門來分組,顯示各員工在部門裡按薪水排名名次.
顯示結果預期如下:
+-------+--------+----------+------+
| 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 |
+-------+--------+----------+------+
3. SQL 實現
select empid,deptid,salary,rank from (
select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1 ,
if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,
@pdept:=heyf_tmp.deptid
from (
select empid,deptid,salary from heyf_t10 order by deptid asc ,salary desc
) heyf_tmp ,(select @rownum :=0 , @pdept := null ,@rank:=0) a ) result
;
4. 結果演示
mysql> select empid,deptid,salary,rank from (
-> select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1 ,
-> if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank,
-> @pdept:=heyf_tmp.deptid
-> from (
-> select empid,deptid,salary from heyf_t10 order by deptid asc ,salary desc
-> ) heyf_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)
5.小結
此SQL正是利用了MYSQL的靈活以及使用者變數的呼叫. 希望大家可以透過此例舉一反三.寫出更多更精彩的SQL.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/703656/viewspace-1018119/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
- sql中row_number over語句SQL
- ROWNUMBER() OVER( PARTITION BY COL1
- 分析函式系列之sum(col1) over(partition by col2 order by col3):實現分組彙總或遞增彙總函式
- WireGuard結合WsTunnel實現UDP OVER TCP組網UDPTCP
- angualr實現滑鼠拖拽排序功能排序
- 原生js實現商品排序功能JS排序
- JS實現前臺表格排序功能JS排序
- sql(oracle)資料處理實用總結開窗函式(over partition)使用SQLOracle函式
- MySQL實現分組排序MySql排序
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- mysql使用自定義序列實現row_number功能MySql
- [WPF]原生TabControl控制元件實現拖拽排序功能控制元件排序
- Java利用Comparator實現分組排序Java排序
- MongoDB 如何實現巢狀子文件分組MongoDB巢狀
- vxe-table 實現表格資料分組,按指定欄位資料分組
- 用listagg函式分組實現列轉行函式
- MySQL自定義變數實現row_number分析函式的天坑MySql變數函式
- MySQL全面瓦解29:使用Partition功能實現水平分割槽MySql
- Yii2實現跨mysql資料庫關聯查詢排序功能MySql資料庫排序
- Web新趨勢:HTML over-the-wire的實現Unpoly框架WebHTML框架
- 【Gin-API系列】實現動態路由分組(七)API路由
- django實現分頁的模組(匯入即可用)Django
- Python正規表示式實現非捕獲分組Python
- Laravel-admin 實現一個分組求和的資料展現Laravel
- Oracle-多表查詢Oracle
- Mysql-主從複製與讀寫分離MySql
- Partition Pruning和Partition-Wise Joins
- 如何在分組報表中實現組內資料補空行及組內頁碼
- BIRT 中根據引數實現動態日期分組
- 在連結串列上實現 Partition 以及荷蘭國旗問題
- Oracle-欄位的新增Oracle
- QSortFilterProxyModel和QTreeView排序功能FilterQTView排序
- Clique Partition
- 使用 CSS columns 佈局來實現自動分組佈局CSS
- 一句話實現MySQL庫中的重疊分組MySql
- 記一次 Angular 基於 STOMP over WebSocket 實現流文字傳輸AngularWeb
- oracle partition by group by,詳解partition by和group by對比Oracle
- JavaScript快速排序功能詳解JavaScript排序