`
borglee
  • 浏览: 134451 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

MySQL实现Oracle里的 rank()over(ORDER BY) 功能

阅读更多
由于MySQL没有Oracle里一样的rank()over()函数,所以我们只能使用SQL语句利用变量来实现这个功能。在此非常感谢 http://hudingchen.iteye.com/ 他的帮助。


例如我有一张表 表名为 A:
ID    SCORE
1      28
2      33
3      33
4      89
5      99
6      68
7      68
8      78
9      88
10    90

现在我需要如下结果:

ID    SCORE    RANK
5      99              1
10    90              2
4      89              3
9      88              4
8      78              5
6      68              6
7      68              7
2      33              8
3      33              9
1      28             10



SELECT id,
       score,
       rank
  FROM (SELECT tmp.id,
               tmp.score,
               @rank := @rank + 1 AS rank
          FROM (SELECT id,
                       score
                  FROM a
                 ORDER BY score desc) tmp,
               (SELECT @rank   := 0) a) RESULT;


希望能够帮助更多的人 感谢您的来访!
分享到:
评论

相关推荐

    MySQL分组排序功能

    本文将详细介绍如何在MySQL中实现类似Oracle中`row_number() over (partition by)`的功能,即按照指定列进行分组,并在每个分组内进行排序。 #### 实现步骤详解 ##### 1. 创建示例表与数据 首先,我们需要创建一...

    Oracle到mysql转换的问题总结.docx

    - Oracle的`DATEDIFF`功能在MySQL中直接通过`DATEDIFF(date1, date2)`实现。 转换过程中需要注意的是,不同的数据库系统有不同的特性和最佳实践,这可能导致SQL语句在语法和逻辑上的差异。理解这些差异并适当地...

    oracle、mysql数据库分页.pdf

    select *, rownumber() over (order by some_column) as ROW_NEXT from tablename ) where ROW_NEXT between min and max; ``` 除了以上介绍的基本方法,还有一些其他的优化策略,如使用`CTE(公共表表达式)`...

    超详细ORACLE培训带实例带书签目录

    - **ORDER BY子句**:排序结果集。 - **LIMIT子句**:限制返回的行数。 #### 第四章 单行函数 - **字符串函数**:如UPPER、LOWER、CONCAT等。 - **数值函数**:如ROUND、TRUNC、MOD等。 - **日期函数**:如SYSDATE...

    SQL练习题.pdf

    * Oracle:`select * from (select A.*, row_number() over (order by id asc) rank FROM A) where rank between 31 and 40` 问题 2 用一条 SQL 语句查询出每门课都大于 80 分的学生姓名 解决方案: * `select ...

    3种数据库分页技术.pdf

    SELECT *, ROW_NUMBER() OVER(ORDER BY ID) AS RowNum FROM table ) SELECT * FROM CTE WHERE RowNum BETWEEN (PageNumber - 1) * PageSize + 1 AND PageNumber * PageSize ``` 这里 `PageNumber` 是当前页码...

    Oracle数据库中SQL开窗函数的使用

    Oracle、SQL Server、DB2等主流数据库系统都实现了开窗函数,但MySQL暂时还不支持。 开窗函数与聚合函数相似,都是对一组行进行计算,但不同之处在于,开窗函数可以在每组内返回多个结果,而不是像聚合函数那样只...

    SQL常见面试题.txt

    DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS top3 FROM emp ) t WHERE t.top3 ; ``` - **解析**: - 使用 `DENSE_RANK()` 函数对每个部门(`deptno`)中的员工按照工资(`sal`)进行降序...

    数据库真分页SQL语句

    SELECT *, ROW_NUMBER() OVER(ORDER BY SomeColumn) AS RowNum FROM YourTable ) AS TmpTable WHERE TmpTable.RowNum BETWEEN ((10 - 1) * 10 + 1) AND (10 * 10) ``` 通过理解并应用这些真分页技术,开发者...

    .net生成sql分页高性能语句类

    7. **数据库兼容性**:虽然此方法主要适用于SQL Server,但其他数据库系统如Oracle和MySQL也有类似的功能,如`RANK()`、`DENSE_RANK()`等,可以根据不同的数据库系统进行适配。 8. **事务与并发**:在高并发环境下...

    ocp教材sql篇

    7. 排序与分组:掌握ORDER BY和GROUP BY子句,用于对结果进行排序和分组。 8. 聚合函数:学习COUNT、SUM、AVG、MAX和MIN等聚合函数,用于统计和分析数据。 9. 连接查询:理解JOIN操作,如INNER JOIN、LEFT JOIN、...

    开窗函数有浅入深详解(一)

    开窗函数在MSSQL Server、Oracle、DB2等主流数据库系统中得到广泛支持,但遗憾的是,MySQL当前版本还不支持。 首先,我们需要理解什么是窗口。在SQL中,"窗口"是指在执行开窗函数时定义的一组行,这组行是相对于...

    分页存储过程sql脚本

    - `ROW_NUMBER()`(SQL Server)/ `RANK()` / `DENSE_RANK()`(Oracle):这些函数为数据集中的每一行生成一个唯一的行号,然后基于这个行号进行分页。例如,`SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY...

    SQL对冗余数据的删除重复记录只保留单条的说明

    SELECT RANK() OVER (ORDER BY 客户编号 DESC) AS 序号, 客户编号,公司名称 FROM 客户; ``` 而在Oracle 10g中,每个记录都有一个唯一的`rowid`,可以通过`rowid`来定位并删除重复记录中的多余项: ```sql -- ...

    第N高薪水_第N高的薪水_

    如果你使用的是Oracle,可能需要调整为`RANK() OVER (ORDER BY salary DESC) = N`。 **方法二:使用自连接** 这种方法通过自我连接表格来找出第N高的薪水,但通常效率较低,不推荐在大数据量的情况下使用。 ```...

    SQL开窗函数的具体实现详解

    (FSalary / LEAD(MIN(FSalary)) OVER (PARTITION BY FCity ORDER BY FSalary ASC)) AS Ratio FROM T_Person WHERE FSalary = (SELECT MIN(FSalary) FROM T_Person WHERE FCity = T_Person.FCity) ``` 在这个查询中...

Global site tag (gtag.js) - Google Analytics