【问题标题】:get top and bottom 25th percentile average获得顶部和底部 25% 的平均值
【发布时间】:2014-08-24 02:03:00
【问题描述】:

我有一张表格,上面有员工名单和他们售出的单位数量。

我想获得前 25 个百分位的平均销售量和后 25 个百分位的平均销售量。

我已经创建了我的数据的表示SLQ Fiddle

我真的不知道如何开始?我看到的所有示例都是针对 SQL Server 而不是 MySQL。这就是我的想法。

我想要 25 个百分位并且不能限制为 25 个项目。基本上它会涉及:

1) #_of_employees = The number of total employees. 

2) #_of_employees_in_25_percentile =  #_of_employees*0.25 

3) Calculate the sum of the units sold by the top/bottom 25 percentile (limit #_of_employees_in_25_percentile)

4) Divide the sum by #_of_employees_in_25_percentile to get the average.

如何在 MySQL 中高效地完成这一切?

【问题讨论】:

标签: mysql sql


【解决方案1】:

这是一个使用了我从from this question学到的诡计的解决方案。

SELECT id, unit_sold, n * 100 / @total AS percentile
FROM (
  SELECT id, unit_sold, @total := @total + unit_sold AS n
  FROM mydata, (SELECT @total := 0) AS total
  ORDER BY unit_sold ASC
) AS t

SQL Fiddle.

【讨论】:

  • 不错的解决方案!只是一个小问题,我认为应该是@total := @total + 1 而不是@total := @total + unit_sold,看起来百分位数是根据员工人数计算的,而不是销售的总单位数。
【解决方案2】:

这个怎么样?

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

【讨论】:

    【解决方案3】:

    用这个逻辑怎么样:

    • 全选,按百分位排序 (DESC),限制为 25
    • 全选,按百分位数 (ASC) 排序,限制为 25

    这是您正在寻找的逻辑类型吗?

    示例查询:

    $q1 = mysql_query(SELECT * FROM table_name ORDER BY percentile DESC LIMIT 25)
    $q2 = mysql_query(SELECT * FROM table_name ORDER BY percentile ASC LIMIT 25)
    

    【讨论】:

    • 对不起,用 unit_sold 替换百分位数。这应该允许您查看已售出的单位数量。从那里,计算百分位数。
    • 限制不能是 25。我需要 25 个百分位数。不是 25。请参阅更新后的问题。
    • 好的,看完改动后,我可以建议你看看这个问题和确认的解决方案吗? stackoverflow.com/questions/3065855/…
    • @DaveWoodhall 这个答案有点相似,但不是我需要的。我需要顶部或底部 25% 的员工销售的平均单位。您指出的答案是最接近X 百分位数的Row
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多