【问题标题】:SQL rank percentileSQL 排名百分位
【发布时间】:2014-12-26 01:35:29
【问题描述】:

我做了一个 SQL 查询,它根据页面的浏览次数对页面进行排名。例如,

╔══════╦═══════╗
║ PAGE ║ VIEWS ║
╠══════╬═══════╣
║ J    ║   100 ║
║ Q    ║    77 ║
║ 3    ║    55 ║
║ A    ║    23 ║
║ 2    ║     6 ║
╚══════╩═══════╝

现在我想做的是使用 SQL 查询找到每个页面的百分位排名。我想用的数学很简单,我只想用已经生成的表的行数除以总行数。或者 1 减去这个值,这取决于我的兴趣。

我可以像这样对已经生成的表执行 COUNT(pages) 吗?我意识到这就是我将获得总行数的方式。但是有没有返回行号的命令?

为了进一步澄清我的问题,我需要以下结果

╔══════╦════════════════╗
║ PAGE ║ Percentile     ║
╠══════╬════════════════╣
║ J    ║   (1-1/5)*100  ║
║ Q    ║   (1-2/5)*100  ║
║ 3    ║   (1-3/5)*100  ║
║ A    ║   (1-4/5)*100  ║
║ 2    ║   (1-5/5)*100  ║
╚══════╩════════════════╝

或者一般来说(1-(行号)/(COUNT(页))*100

【问题讨论】:

  • 你在用什么RDBMSRDBMS 代表关系数据库管理系统RDBMS is the basis for SQL,对于所有现代数据库系统,如 MS SQL Server、IBM DB2、Oracle、MySQL 等......你能不能也展示一下你想要的结果是什么?
  • MySQL。我将添加一个我正在寻找的示例的附加表格。
  • 谢谢:D
  • 说明 DBMS 的另一个原因是大多数 DBMS 已经内置了这样的功能(只是没有 MySQL)。

标签: mysql sql rank percentile


【解决方案1】:
SELECT  page, 
        views,
        (1-ranks/totals)*100 Percentile
FROM
(
    SELECT  page,
            views,
            @rank:=@rank + 1 ranks,
            (SELECT COUNT(*) FROM tableName) totals
    FROM    tableName a,
            (SELECT @rank:=0) s
    ORDER   BY views DESC
) s

【讨论】:

    【解决方案2】:

    您无法在单个 SQL 语句中计算跨表的百分位等级。 John Woo 在此处建议的方法在计算出最高排名后就失效了,即使结果对于正在处理的表的第一个(不可预测的)百分比(即前几个百分位数)看起来确实不错。

    Oracle Ace Roland Bouman 在这篇文章中解释了原因: http://rpbouman.blogspot.com/2009/09/mysql-another-ranking-trick.html

    简而言之:用户定义的变量并非设计为在单个 SQL 语句中可靠,仅在多个 SQL 语句中可靠。

    阅读 MySQL 手册中关于用户定义变量的第一句话: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html “您可以在一个语句中将一个值存储在用户定义的变量中,然后稍后在另一个语句中引用它。”

    然后在大约第 10 段中看到这个明确的声明:“作为一般规则,除了在 SET 语句中,您不应该为用户变量赋值并在同一语句中读取值。[...]涉及用户变量的表达式的求值顺序未定义。"

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 2014-04-15
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多