1

我正在从数据库中进行一些查询以制作图表,可能需要的图表是每月一组值的中位数。我知道如何获得整个数据集的中位数,但由于某种原因,我无法让 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;
4

2 回答 2

1

mysql的聚合函数讨论页面上的人们以临时表结尾。在那里搜索“中位数”。

于 2011-08-08T13:31:03.240 回答
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将按升序对月份的值进行排序
  • 然后使用 firstsubstring_index将从第一个值返回到中间值 +1 个位置
  • 然后下一步substring_index将帮助您获得最正确的值(即中位数)
于 2011-08-08T13:49:03.837 回答