zoukankan      html  css  js  c++  java
  • MySQL实现分组排序(8.0版本以下ROW_NUMBER() OVER())

    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)  
     
     
     
    MySql中取出每个分组中的前N条记录   
    select a1.* from article a1   
     
    inner join   
     
    (select a.type,a.date from article a left join article b   
     
    on a.type=b.type and a.date<=b.date    
     
    group by a.type,a.date   
     
    having count(b.date)<=2  
     
    )b1   
     
    on a1.type=b1.type and a1.date=b1.date  
     
    order by a1.type,a1.date desc  
  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/luxd/p/15245917.html
Copyright © 2011-2022 走看看