Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获得百分位数?_Mysql - Fatal编程技术网

Mysql 如何获得百分位数?

Mysql 如何获得百分位数?,mysql,Mysql,我的表中有3个字段,我可以在其他字段中按顺序排序,我想创建一个查询,在进行一些分组等操作后,该查询将为我提供所有行,以及每个行相对于这4个字段的百分比 我该怎么做?我猜我需要一个子查询,但我不知道如何 示例输入如下所示: age | first_name | last_name | votes ----+------------+-----------+------- 10 | Bob | Smith | 2 10 | Bob | Smith |

我的表中有3个字段,我可以在其他字段中按顺序排序,我想创建一个查询,在进行一些分组等操作后,该查询将为我提供所有行,以及每个行相对于这4个字段的百分比

我该怎么做?我猜我需要一个子查询,但我不知道如何

示例输入如下所示:

age | first_name | last_name | votes
----+------------+-----------+-------
 10 | Bob        | Smith     |  2
 10 | Bob        | Smith     |  3
 50 | John       | Adams     |  1
 50 | John       | Adams     |  1
 50 | John       | Adams     |  2
100 | Andy       | Johnson   |  2
示例输出应如下所示,经过一些转换(例如,将投票数相加):

age | first_name | last_name | votes | age_per | first_name_per | last_name_per
----+------------+-----------+-------+---------+----------------+-------------
 10 | Bob        | Smith     |  5    |   33    |    66          |    99
 50 | John       | Adams     |  4    |   66    |    99          |    33
100 | Andy       | Johnson   |  2    |   99    |    33          |    66

像这样的?我现在没有MySQL实例来测试它

SELECT age, 
       first_name, 
       last_name, 
       SUM(votes), 
       COUNT(age) / (SELECT COUNT(age) FROM table t WHERE t.age = age) as age_per, 
       COUNT(first_name) / (SELECT COUNT(first_name) FROM table t WHERE t.first_name = first_name) as first_name_per, 
       COUNT(last_name) / (SELECT COUNT(last_name) FROM table t WHERE t.last_name = last_name) as last_name_per
FROM table
GROUP BY age, first_name, last_name

请原谅我的无知,没有足够的信息进行下去,你是在寻找每列的百分比,还是四列的百分比?很容易得到一组值的最小值、最大值、平均值。请澄清这一比例的百分比。你想要什么百分位数?在做一些分组之后,等等-做什么分组?有人真的不可能根据这些模糊的语句编写查询…@ajreal:对不起,我的意思是在每列之外-结果行中将有3个新列,每个列的百分位数对应一个。丹:百分位数,中位数=第50百分位数,第一个四分位数=第25百分位数,等等。这是否意味着在名字的第66百分位数?我退出了。我想OP是指33=1位,66=2位
SELECT age
     , first_name 
     , last_name 
     , SUM(votes) AS votes
     , ( SELECT COUNT(DISTINCT age)
         FROM tableX AS a
         WHERE a.age <= t.age
       ) * 100 / distinct_age_count
       AS age_per
     , ( SELECT COUNT(DISTINCT first_name)
         FROM tableX AS f
         WHERE f.first_name <= t.first_name
       ) * 100 / distinct_first_name_count
       AS first_name_per
     , ( SELECT COUNT(DISTINCT last_name)
         FROM tableX AS l
         WHERE l.last_name <= t.last_name
       ) * 100 / distinct_last_name_count
       AS last_name_per
FROM
    tableX AS t
  CROSS JOIN
    ( SELECT COUNT(DISTINCT age) AS distinct_age_count
      FROM tableX
    ) AS ad
  CROSS JOIN
    ( SELECT COUNT(DISTINCT first_name) AS distinct_first_name_count
      FROM tableX
    ) AS fd
  CROSS JOIN
    ( SELECT COUNT(DISTINCT last_name) AS distinct_last_name_count
      FROM tableX
    ) AS ld
GROUP BY age
       , first_name
       , last_name