2015-11-05 113 views
0

假設我知道在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

回答

0

這裏是幾乎做到了以下@ 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 | 
+------+ 
0

如果你想爲一個條目軍銜,嘗試此查詢:

SELECT COUNT(DISTINCT sum_squares) + 1 
FROM entries 
WHERE sum_squares > 5 ;