MYSQL-實現ORACLE- row_number() over(partition by ) 分組排序功能

來源:互聯網
上載者:User

標籤:des   style   blog   http   io   color   ar   sp   資料   

MYSQL-實現ORACLE- row_number() over(partition by ) 分組排序功能

 

  由於MYSQL沒有提供類似ORACLE中OVER()這樣豐富的分析函數. 所以在MYSQL裡需要實現這樣的功能,我們只能用一些靈活的辦法:

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 |+-------+--------+----------+------+9 rows in set (0.00 sec)

 

3. SQL 實現
SELECT    empid,    deptid,    salary,    rankFROM    (        SELECT            empid,            deptid,            salary,        IF (            @pdept = src.deptid ,@rank := @rank + 1 ,@rank := 1        ) AS rank,        @pdept := src.deptid AS g    FROM        (            SELECT                empid,                deptid,                salary            FROM                heyf_t10            ORDER BY                deptid ASC,                salary DESC        ) src,        (            SELECT                @pdept := NULL ,@rank := 0        ) var    ) z;

 

4. 結果示範
mysql> SELECT    ->  empid,    ->  deptid,    ->  salary,    ->  rank    -> FROM    ->  (    ->          SELECT    ->                  empid,    ->                  deptid,    ->                  salary,    ->    ->          IF (    ->                  @pdept = src.deptid ,@rank := @rank + 1 ,@rank := 1    ->          ) AS rank,    ->          @pdept := src.deptid AS g    ->  FROM    ->          (    ->                  SELECT    ->                          empid,    ->                          deptid,    ->                          salary    ->                  FROM    ->                          heyf_t10    ->                  ORDER BY    ->                          deptid ASC,    ->                          salary DESC    ->          ) src,    ->          (    ->                  SELECT    ->                          @pdept := NULL ,@rank := 0    ->          ) var    ->  ) z;+-------+--------+----------+------+| 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)

 

 

 

 

轉自:  http://ace105.blog.51cto.com/639741/724411

 

MYSQL-實現ORACLE- row_number() over(partition by ) 分組排序功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.