MySQL 中是否有类似 Oracle 的 dense_rank() 和 row_number() 之类的函数?

Are there any functions in MySQL like dense_rank() and row_number() like Oracle?

MySQL 中是否有像 dense_rank()row_number() 类似 Oracle 和其他 DBMS 提供的功能?

我想在查询中生成一个 id,但在 MySQL 中没有这些函数。有其他选择吗?

MySql 中你没有 dense_rank()row_number()Oracle 中的那样。

但您可以通过 SQL 查询创建相同的功能:

这是一篇做同样事情的文章:

dense_rank()

row_number()

Mysql 没有它们,但您可以使用以下使用用户定义变量的表达式模拟 row_number()

(@row := ifnull(@row, 0) + 1)

像这样:

select *, (@row := ifnull(@row, 0) + 1) row_number
from mytable
order by id

但如果您要重复使用该会话,@row 仍将被设置,因此您需要像这样重置它:

set @row := 0;
select *, (@row := @row + 1) row_number
from mytable
order by 1;

参见SQLFiddle

dense_rank() 是可能的,但火车失事;我建议在应用程序层处理该要求。

MySQL不支持这些功能,但你可以自己模仿。无耻地link我的解决方案ROW_NUMBER, RANK and DENSE_RANK functions in MySQL

我们现在..

select ename, sal, dense_rank() over (order by sal desc)rnk
from emp2 e
order by rnk;

DENSE_RANK() 函数在 MySQL 版本 8.0 中可用。因此,如果您使用的是 MySQL 8.0 版,则可以 运行 此命令,

SELECT name, DENSE_RANK() OVER ( ORDER BY value ) my_rank FROM table_name;

MySQL 版本 8 现在有 ROW_NUMBER。 Documentation

示例:

SELECT 
    ROW_NUMBER() OVER (ORDER BY s.Id) AS 'row_num', 
    s.product,
    s.title
FROM supplies AS S