MySQL sql Rank()函数实现

本文详细介绍了MySQL SQL Rank()函数的使用方法,包括如何通过分组和排序来查找特定列的倒序第一个数据。同时,文章还讨论了在实际应用中遇到的问题,如变量缓存错误,并提供了解决方法。此外,文章分享了一个优化版的SQL查询,通过调整字段顺序和使用子查询来提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 MySQL sql Rank()函数实现

两列数据,以a列作为分组,查找以b列倒序的第一个。

select a,b,rownum,rank from 
    (select 
         tt.a,
         tt.b,
         @rownum:=@rownum+1 rownum,#@rownum变量加1,作为rownumber,        
         if(@temp=tt.a,@rank:=@rank+1,@rank:=1) as rank,#tt.a字段等于@temp变量,则@rank加1,否则@rank赋值为1
         @temp:=tt.a#将tt.a字段赋予@temp变量 注意该字段赋值顺序,先赋值,再自加减
        
    FROM#以下两表作关联
       (select a,b from your_table_name 
           group by a,b 
           order by a asc,b desc) tt,#一定要将同组的数据排序到一起,业务上是实际是以a作为分组,需要放前面;b业务上实际是作排序字段
       (select @rank:=0,@rownum:=0,@temp:=null) ee
    ) result
    having rank =1;

 注意 :@temp:=tt.a, 字段顺序,之前将该字段放在最后,发现问题,应该缓存出现了问题,rank列表全部为1,在该SQL执行第二次的时候rank列表才显示正常。

 

 

试试这个:

SELECT * FROM (

     SELECT * FROM posts ORDER BY dateline DESC

) GROUP BY  tid ORDER BY dateline DESC LIMIT 10  

  

 

参考:http://blog.youkuaiyun.com/ariczhou/article/details/48808417

<think>好的,用户想了解MySQL中的RANK函数及其使用方法和支持情况。首先,我需要确认MySQL的哪个版本开始支持RANK函数。根据引用[1],ROW_NUMBER()是从8.0版本引入的,而RANK属于窗口函数,应该也是从8.0开始支持的。接下来,我需要解释RANK函数的基本用法,可能需要结合PARTITION BY和ORDER BY子句,如引用[2]提到的窗口函数语法。 然后,要区分RANK、DENSE_RANK和ROW_NUMBER的不同,引用[4]详细说明了这三者的区别,比如RANK会出现间断的排名,而DENSE_RANK是连续的。需要举例说明,比如当有相同分数时,RANK的处理方式。同时,用户可能想知道如何在实际查询中编写这些函数,引用[3]给出了一个具体的例子,可以借鉴那个结构。 还需要提到低版本MySQL不支持的情况,如果用户使用的是旧版本,可能需要替代方案,比如变量模拟排名。但根据引用[1],8.0之前可能没有这些窗口函数,所以需要说明支持情况。 最后,检查是否覆盖了用户的问题:是否存在RANK函数,如何使用,支持版本,以及示例。确保回答结构清晰,分点说明,并引用正确的参考资料。可能还需要生成相关问题,比如比较不同排名函数或处理不支持的情况的方法。</think>### MySQL中的RANK函数使用详解 #### 1. RANK函数的支持情况 MySQL从**8.0版本**开始支持窗口函数(Window Functions),包括$RANK()$、$DENSE\_RANK()$和$ROW\_NUMBER()$等排名函数。这些函数需配合`OVER`子句使用,用于生成基于排序规则的序号[^1][^2]。 #### 2. 基本语法 ```sql RANK() OVER ( [PARTITION BY 分组字段] ORDER BY 排序字段 [ASC|DESC] ) ``` - `PARTITION BY`:按指定字段分组计算排名 - `ORDER BY`:定义排序规则 - 示例:统计员工薪资排名 ```sql SELECT emp_no, salary, RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM salaries; ``` #### 3. 排名函数对比 | 函数 | 特点 | 示例结果(相同值) | |------|------|------------------| | `RANK()` | 允许并列,后续排名跳号 | 1,2,2,4 | | `DENSE_RANK()` | 允许并列,后续连续 | 1,2,2,3 | | `ROW_NUMBER()` | 禁止并列 | 1,2,3,4 | 具体差异说明见[^4]。 #### 4. 进阶用法 **分组排名示例**(按部门分组计算薪资排名): ```sql SELECT department_id, emp_name, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dept_rank FROM employees; ``` #### 5. 版本兼容方案 对于**8.0以下版本**,可通过变量模拟实现: ```sql SELECT emp_no, salary, @rank := IF(@prev_salary = salary, @rank, @rank + 1) AS custom_rank, @prev_salary := salary FROM salaries, (SELECT @rank := 0, @prev_salary := NULL) vars ORDER BY salary DESC; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值