【问题标题】:mysql median value per month每月mysql中值
【发布时间】:2011-10-22 09:45:29
【问题描述】:

我正在从数据库中进行一些查询以制作图表,可能需要的图表是每月一组值的中位数。我知道如何获取整个数据集的中位数,但由于某种原因,我无法让 GROUP BY MONTH(..) 分隔月份,因此它返回每月的中位数。

这是我拥有的数据,我希望每个月都能得到每个月的中值,无论构建类型如何。

'Development', 1013.0164, 'June'
'Development', 1170.8999, 'July'
'Development', 671.2837, 'August'
'Flash Assets', 2961.3832, 'June'
'Flash Assets', 6662.2335, 'July'
'Flash Assets', 3902.5000, 'August'
'Release', 54.5499, 'June'
'Release', 62.4832, 'July'
'Release', 398.8500, 'August'
'Repackage', 1360.0834, 'June'
'Repackage', 6286.8505, 'July'
'Repackage', 1274.7833, 'August'
'Component', 16378.0161, 'June'
'Component', 6063.5482, 'July'
'Component', 23663.2496, 'August'
'Source Diff', 1503.8834, 'June'
'Source Diff', 1051.4500, 'July'
'Source Diff', 73.7002, 'August'

我想结束这个,

June, XXXX
July, XXXX
August, XXXX

谢谢。

编辑:当前查询

这是我现在用来获取总体中位数的查询,我不确定如何将其转换为每月获取。

 SELECT t.Data AS 'Median' FROM
 (SELECT CEIL(COUNT(*)/2.0) as 'Middle', s.Data as 'Data' FROM
 (SELECT bt.name as 'Labels', 
 SUM(TIME_TO_SEC(TIMEDIFF(bs.eventtime, b.submittime))/60.0) 
 AS 'Data', MONTHNAME(b.submittime) FROM builds b 
 JOIN buildstatuses bs ON bs.buildid = b.id 
 JOIN buildtypes bt ON bt.id = b.buildtype 
 WHERE MONTH(b.submittime) BETWEEN MONTH(CURDATE())-2 AND MONTH(CURDATE()) 
 AND bs.status LIKE 'Started HANDLER' 
 GROUP BY b.buildtype, MONTH(b.submittime) ORDER BY 'Data' ) s )t;

【问题讨论】:

  • 最后一列是保存日期的字符串。我这里只是使用MONTHNAME()函数来显示名字
  • 您如何获得中位数,AFAIK MySQL 不为此提供聚合函数(正如您使用 GROUP BY 所暗示的那样)?
  • 现在我将使用嵌套选择来获取整个数据集的中位数。我真正想要的是每月数据的中位数。我将在上面进行编辑并发布查询。

标签: mysql median


【解决方案1】:

如果你的值总是浮动...你可以试试这个 --

假设Data 是值列

select mth,
substring_index
(
  substring_index
  (
    group_concat(Data order by Data), ',', 
    count(*)/2+1
  ), 
  ',', -1
)
from your_tables
group by mth;
  • group_concat 将按升序对月份的值进行排序
  • 然后使用第一个 substring_index 将从第一个值返回到中间值 +1 个位置
  • 然后下一个substring_index 将帮助您获得最正确的值(即中值)

【讨论】:

  • group_concat_max_len 通常设置为 1024,因此您的数据将被截断长度为 1024。此示例仅适用于非常小的数据集。
  • 你可以为 group_concat_max_len 设置一个更大的值
【解决方案2】:

Peolple at the mysql's aggregate functions discussion page 以临时表结束。在那里搜索“中位数”。

【讨论】:

  • 这显示了如何获得中位数是的,但我正在寻找的是每月的中位数。
  • 在临时表创建中包括按月分组,您将拥有每月的 medain。
猜你喜欢
  • 2016-09-12
  • 2012-03-20
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多