MySQL значение медианы в месяц - PullRequest
1 голос
/ 08 августа 2011

Я делаю несколько запросов из базы данных для построения графиков, и график, который может понадобиться, представляет собой медиану набора значений в месяц. Я знаю, как получить медиану всего набора наших данных, но по какой-то причине я не могу заставить 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;

Ответы [ 2 ]

1 голос
/ 08 августа 2011

, если ваше значение всегда в плавающей запятой ... вы можете попробовать это -

предположим, 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 поможет вам получить наиболее правильное значение (которое является медианой)
1 голос
/ 08 августа 2011

Peolple на странице обсуждения агрегатных функций mysql заканчивается временными таблицами. Ищите "медиана" там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...