MySQL 中是否有像 Oracle 中的 dense_rank() 和 row_number() 这样的函数?

8

MySQL是否有类似于Oracle和其他DBMS提供的dense_rank()row_number()之类的函数?

我想在查询中生成一个id,但是在MySQL中没有这些功能。是否有替代方案?


1
简单的答案是否定的,您必须在查询中使用用户定义变量并手动计算。 - M Khalid Junaid
如何在查询中手动计算,你能告诉我吗?我是MySQL的新手。@MKhalidJunaid - CSiva
https://dev59.com/U0nSa4cB1Zd3GeqPKQac#1320196 - Drew
MySQL中的Rownum:https://dev.mysql.com/doc/internals/en/procedure-rownum.html - inetphantom
6个回答

5

We have now..

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

5
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()是可行的,但会很混乱;我建议在应用程序层处理该要求。


但是每次执行查询时,数字都在不断增加。 - CSiva
@CSiva请查看编辑内容,了解如何解决“行号不断增加”的问题。 - Bohemian

1
MySql 中,你没有像 Oracle 中的 dense_rank()row_number() 这样的功能。但是你可以通过 SQL 查询创建相同的功能。以下是一篇介绍如何实现该功能的文章:

dense_rank()

row_number()


1

0

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

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

0

MySQL 8 版本现在支持 ROW_NUMBER。 文档

示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接