MySQL是否有类似于Oracle和其他DBMS提供的dense_rank()
和row_number()
之类的函数?
我想在查询中生成一个id,但是在MySQL中没有这些功能。是否有替代方案?
MySQL是否有类似于Oracle和其他DBMS提供的dense_rank()
和row_number()
之类的函数?
我想在查询中生成一个id,但是在MySQL中没有这些功能。是否有替代方案?
We have now..
select ename, sal, dense_rank() over (order by sal desc)rnk
from emp2 e
order by rnk;
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;
dense_rank()
是可行的,但会很混乱;我建议在应用程序层处理该要求。
MySql
中,你没有像 Oracle
中的 dense_rank()
或 row_number()
这样的功能。但是你可以通过 SQL
查询创建相同的功能。以下是一篇介绍如何实现该功能的文章:
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。 文档
示例:
SELECT
ROW_NUMBER() OVER (ORDER BY s.Id) AS 'row_num',
s.product,
s.title
FROM supplies AS S