【问题标题】: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 database row-number


【解决方案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()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-14
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          相关资源
          最近更新 更多