Mysql 检索SQL列中特定值的百分比
假设我知道在SQL列中有一个特定的值,我想确定它的百分位数。基于另一个SO post(),我尝试修改它,它可以工作,但返回列中每个值的排名:Mysql 检索SQL列中特定值的百分比,mysql,sql,Mysql,Sql,假设我知道在SQL列中有一个特定的值,我想确定它的百分位数。基于另一个SO post(),我尝试修改它,它可以工作,但返回列中每个值的排名: mysql> SELECT FIND_IN_SET( sum_squares, (SELECT GROUP_CONCAT(sum_squares ORDER BY sum_squares DESC) | -> FROM entries)
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
有人能给我解释一下为什么我的查询似乎被拒绝了,还有没有其他方法可以做到这一点?我宁愿不返回整个专栏
下面是一个示例条目表:
+----+-------------+
| 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
但是,这将在匹配行中返回答案,在其他行中返回NULL,因此我欢迎对此进行改进。谢谢
+------+
| rank |
+------+
| 4 |
| 4 |
| NULL |
| NULL |
| NULL |
+------+
如果您想要单个条目的排名,请尝试以下查询:
SELECT COUNT(DISTINCT sum_squares) + 1
FROM entries
WHERE sum_squares > 5 ;
使用having
子句,而不是where
子句。这是一个MySQL扩展,可以满足您的需要。另外,您需要将它放在select语句中的正确位置。@GordonLinoff就是这样做的。如果你不想的话,我可以发布答案(把have放在条目的第一个后面)。让我知道。