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 功能?
R中是不是有像bigmemory这样的包可以处理大型列表对象?