在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 | 
+----+-------------+ 
+0

使用'having'条款,而不是一个'where'条款。这是一个MySQL扩展,可以做你想做的事情。另外,你需要把它放在select语句的正确位置。 –

+0

@GordonLinoff做到了。如果您不想要,我可以发布答案(在第一个FROM条目之后放置HAVING)。让我知道。 – sunny

这里是几乎做到了以下@ 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 ;