-1

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

4

2 回答 2

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

于 2014-12-25T17:35:29.900 回答
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
于 2013-03-06T07:40:27.083 回答