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