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