码迷,mamicode.com
首页 > 数据库 > 详细

MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能

时间:2014-11-06 14:44:57      阅读:306      评论:0      收藏:0      [点我收藏+]

标签: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,
    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;

 

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 ) 分组排序功能

标签:des   style   blog   http   io   color   ar   sp   数据   

原文地址:http://www.cnblogs.com/mjorcen/p/4078634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!