SQL排名百分(SQL rank percentile)

2019-08-17 08:35发布

我做了一个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

Answer 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
  • SQLFiddle演示


Answer 2:

在一个SQL语句不能跨表计算百分等级。 这里由吴宇森所建议的做法滑落后,除了顶尖行列的计算,即使这样做的结果不好看正在处理的表的第一(不可预测的)百分比,这意味着前几名百分点。

为什么在这个帖子由Oracle王牌罗兰·鲍曼解释了原因: 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语句,你永远不应该赋值给一个用户变量和相同的语句中读取的值的顺序。[。]评估涉及用户变量表达式是不明确的。“



文章来源: SQL rank percentile