SQL等级百分位数

时间:2013-03-06 07:17:16

标签: mysql sql rank percentile

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

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

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

我可以像这样在已生成的表上执行COUNT(页面)吗?我意识到我将如何获得总行数。但有没有命令返回行号?

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

╔══════╦════════════════╗
║ 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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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语句中,您不应该为用户变量赋值并在同一语句中读取值。 [ 。 。]涉及用户变量的表达式的评估顺序是未定义的。 "