AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 122410
Accepted
Taylor Clark
Taylor Clark
Asked: 2015-11-30 14:47:56 +0800 CST2015-11-30 14:47:56 +0800 CST 2015-11-30 14:47:56 +0800 CST

如果计数相同,则显示相同的排名

  • 772

我想弄清楚如何正确显示排名,如果多个作者的文章数量相同,那么他们会获得相同的排名,然后排名会在正确的位置恢复。例如,如果前 4 人的文章数相同,那么我希望他们都排名为 1,然后第 5 个人排名为 5。以下查询输出如下所示:

SELECT @rownum:=@rownum + 1 as Rank, 
   subq1.*
FROM ( SELECT Uni.University_Name, COUNT( * ) AS ArticleCount
FROM Author_University AS AU, University AS Uni, Articles AS Art
WHERE Art.Year_Published >= '2010'
AND Uni.University_ID = AU.University_ID
AND Art.Article_ID = AU.Article_ID
GROUP BY University_Name
ORDER BY ArticleCount DESC
LIMIT 0 , 25 
  ) subq1,
(SELECT @rownum := 0) r

在此处输入图像描述

mysql rank
  • 1 1 个回答
  • 425 Views

1 个回答

  • Voted
  1. Best Answer
    Andriy M
    2015-12-01T13:54:55+08:002015-12-01T13:54:55+08:00

    这是使用变量实现同等排名的一种方法:

    SELECT
      @lastrank := (subq1.ArticleCount = @lastcount) * @lastrank
                + (subq1.ArticleCount <> @lastcount) * (@rank := @rank + 1) AS Rank,
      subq1.University_Name,
      @lastcount := subq1.ArticleCount AS ArticleCount
    FROM
      (
        SELECT
          Uni.University_Name,
          COUNT(*) AS ArticleCount
        FROM
          Author_University AS AU,
          University AS Uni,
          Articles AS Art
        WHERE
          Art.Year_Published >= '2010'
          AND Uni.University_ID = AU.University_ID
          AND Art.Article_ID = AU.Article_ID
        GROUP BY
          University_Name
        ORDER BY
          ArticleCount DESC
        LIMIT
          0, 25 
      ) AS subq1,
      (
        SELECT
          @lastcount := 0,
          @lastrank := (@rank := 0)
      ) AS r
    ;
    

    该方法中三个变量的作用是:

    • @rank– 计算和存储连续的、唯一的排名;

    • @lastrank– 存储上一行的排名;

    • @lastcount– 存储上一行的计数值。

    这是Rank表达式的工作原理。如果当前行ArticleCount等于@lastcount,则ArticleCount = @lastcount条件的计算结果为true,而另一行的计算ArticleCount <> @lastcount结果当然为false。在算术运算 ( *) 的上下文中,true隐式转换为 1 和false0。因此,表达式等效于:

    1 * @lastrank + 0 * (@rank := @rank + 1)
    

    反过来,它简化为 just @lastrank。因此,当ArticleCount等于 时@lastcount,@lastrank保留其前一行的值。然后将当前计数存储在中@lastcount,以便与下一行进行比较。

    这种方式@lastrank保持不变,直到ArticleCount不再等于@lastcount。在这一点上true和false- 以及 1 和 0 - 交换位置并且表达式变得等价于此:

    0 * @lastrank + 1 * (@rank := @rank + 1)
    

    所以最后@lastrank得到 的评估结果(@rank := @rank + 1),这将只是一个新的排名。但是请注意,它(@rank := @rank + 1)实际上对每一行进行评估,但@lastrank仅在ArticleCount更改为新值时才分配给它。

    正是@rank每一行都增加的事实使我们能够获得这种排名,但存在差距。为了比较,考虑这个 CASE 表达式:

    CASE WHEN ArticleCount = @lastcount THEN @lastrank ELSE (@rank := @rank + 1) END
    

    或使用 IF() 函数的等效函数:

    IF(ArticleCount = @lastcount, @lastrank, (@rank := @rank + 1))
    

    这些变化中的每一个都会给我们同样的排名,但排名不会有差距——也就是说,1, 1, 3, 4, 4, 4, 7我们会得到,而不是 eg 1, 1, 2, 3, 3, 3, 4。原因是,(@rank := @rank + 1)每种情况下的赋值只有当/当Article不同于@lastcount- 换句话说,只有在发生变化时@rank才会增加并分配给,这与第一种方法不同,后者不断增加。@lastrankArticleCount@rank

    • 2

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve