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

Posted

技术标签:

【中文标题】MySQL中是不是有像Oracle这样的dense_rank()和row_number()这样的函数?【英文标题】:Are there any functions in MySQL like dense_rank() and row_number() like Oracle?MySQL中是否有像Oracle这样的dense_rank()和row_number()这样的函数? 【发布时间】:2015-12-06 07:57:33 【问题描述】:

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

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

【问题讨论】:

简单的答案是否定的,您必须使用用户定义的变量并在查询中手动计算 如何在查询中手动计算你能告诉我我是 mysql 新手吗@MKhalidJunaid ***.com/a/1320196/1816093 mysql中的Rownum:dev.mysql.com/doc/internals/en/procedure-rownum.html 【参考方案1】:

MySQL 版本 8 现在有 ROW_NUMBER。 Documentation

示例:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我们现在..

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

【讨论】:

我不知道为什么有人不赞成这个。现在这应该是正确的答案了。【参考方案4】:

MySQL 不支持这些功能,但您可以自己模仿它们。无耻地将我的解决方案链接到ROW_NUMBER, RANK and DENSE_RANK functions in MySQL

【讨论】:

【参考方案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 查看编辑以了解如何克服“不断增加的行数”问题。 非常感谢@Bohemian,您的回答对我帮助很大【参考方案6】:

MySql 中,您没有dense_rank()row_number(),就像Oracle 中的那样。

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

这里有一篇文章也是这样做的:

dense_rank()row_number()

【讨论】:

以上是关于MySQL中是不是有像Oracle这样的dense_rank()和row_number()这样的函数?的主要内容,如果未能解决你的问题,请参考以下文章

在有像 1,00,000 这样的大量孩子的列表视图中使用 AutomaticKeepAliveClientMixin 是不是很好?

是否有像 MySQL 的 pg_trgm (PostgreSQL) 这样的 Trigram 功能?

C# 中是不是有像 C++ 这样的指针?安全吗?

R中是不是有像bigmemory这样的包可以处理大型列表对象?

TestNG 是不是有像 SpringJUnit4ClassRunner 这样的跑步者

在 C# 中是不是有像 Dictionary<> 这样的类,但只有键,没有值?