在SQL列中检索特定值的百分位数
问题描述:
假设我知道在SQL列中具有特定值,并且我想确定其百分位数。根据另一SO发布(https://dba.stackexchange.com/questions/13703/get-the-rank-of-a-user-in-a-score-table)我试图修改此,这工作,但返回列中的每个值的排名:在SQL列中检索特定值的百分位数
mysql> SELECT FIND_IN_SET(sum_squares, (SELECT GROUP_CONCAT(sum_squares ORDER BY sum_squares DESC) |
-> FROM entries) |
->) AS rank |
-> FROM entries;
如下:
+------+ |
| rank | |
+------+ |
| 4 | |
| 4 | |
| 2 | |
| 3 | |
| 1 | |
+------+
我试图修改它在FROM entries
如下之前追加WHERE
声明:
mysql> SELECT FIND_IN_SET(sum_squares, (SELECT GROUP_CONCAT(sum_squares ORDER BY sum_squares DESC) |
-> FROM entries) |
->) AS rank
->) WHERE sum_squares = 5 |
-> FROM entries;
这将导致以下错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE sum_squares = 5
FROM entries' at line 4
有人可以向我解释为什么我的查询似乎被禁止,如果有另一种方式来做到这一点?我宁愿不返回整个专栏!
下面是一个示例entries
表:
+----+-------------+
| id | sum_squares |
+----+-------------+
| 1 | 5 |
| 2 | 5 |
| 3 | 55 |
| 4 | 33 |
| 5 | 111 |
+----+-------------+
答
这里是几乎做到了以下@ GordonLinoff的评论:
mysql> SELECT FIND_IN_SET(sum_squares, (SELECT GROUP_CONCAT(sum_squares ORDER BY sum_squares DESC)
-> FROM entries HAVING sum_squares = 5)
->) AS rank
-> FROM entries
然而,这返回答案,匹配在其他行的行加空,所以我希望对此有所改进。谢谢。
+------+
| rank |
+------+
| 4 |
| 4 |
| NULL |
| NULL |
| NULL |
+------+
答
如果你想为一个条目军衔,尝试此查询:
SELECT COUNT(DISTINCT sum_squares) + 1
FROM entries
WHERE sum_squares > 5 ;
使用'having'条款,而不是一个'where'条款。这是一个MySQL扩展,可以做你想做的事情。另外,你需要把它放在select语句的正确位置。 –
@GordonLinoff做到了。如果您不想要,我可以发布答案(在第一个FROM条目之后放置HAVING)。让我知道。 – sunny