这个怎么样?
SELECT
SUM(unit_sold) AS sum_tot, SUM(unit_sold)/count(id) AS average,
SUM(CASE WHEN percentile<25 THEN unit_sold ELSE 0 END) AS sum_top25,
SUM(CASE WHEN percentile<25 THEN 1 ELSE 0 END) AS count_top25,
SUM(CASE WHEN percentile<25 THEN unit_sold ELSE 0 END)/SUM(CASE WHEN percentile<25 THEN 1 ELSE 0 END) AS average_top25,
SUM(CASE WHEN percentile>75 THEN unit_sold ELSE 0 END) AS sum_bottom25,
SUM(CASE WHEN percentile>75 THEN 1 ELSE 0 END) AS count_bottom25,
SUM(CASE WHEN percentile>75 THEN unit_sold ELSE 0 END)/SUM(CASE WHEN percentile>75 THEN 1 ELSE 0 END) AS average_bottom25
FROM
(SELECT
id, unit_sold, c * 100 / @counter AS percentile
FROM
(SELECT
m.*, @counter:=@counter+1 AS c
FROM
(SELECT @counter:=0) AS initvar, mydata AS m
ORDER BY unit_sold desc
) AS t
WHERE
c <= (25/100 * @counter)
OR c >= (75/100 * @counter)
) AS t2
输出:
SUM_TOT AVERAGE SUM_TOP25 COUNT_TOP25 AVERAGE_TOP25 SUM_BOTTOM25 COUNT_BOTTOM25 AVERAGE_BOTTOM25
850 283.3333 500 1 500 350 2 175
见SQL Fiddle。
这个想法是使用MySQL: LIMIT by a percentage of the amount of records? 解决方案来获取百分位数。基于此(以及在pdw answer),我们创建了一个输出,其中仅显示前 25% 和后 75%。
最后,我们计算和求和以获得您请求的值。
注意这在命令之上运行:
SELECT
id, unit_sold, c * 100 / @counter AS percentile
FROM
(SELECT
m.*, @counter:=@counter+1 AS c
FROM
(SELECT @counter:=0) AS initvar, mydata AS m
ORDER BY unit_sold desc
) AS t
WHERE
c <= (25/100 * @counter)
OR c >= (75/100 * @counter)
谁的输出是:
ID UNIT_SOLD PERCENTILE
d 500 20
a 250 80
e 100 100