2011-08-08 36 views
1

我從數據庫做一些查詢,使圖形,以及可能需要一個圖是一組每月值的中值。我知道如何獲得整組數據的中位數,但由於某些原因,我無法獲得GROUP BY MONTH(..)來分隔月份,因此它會返回每月的中位數。MySQL的中值每月

這裏是我的數據,我想每個月拿到每個月的中值,無論構建類型。

'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; 
+0

最後一列是保存日期的字符串。我只是在這裏使用'MONTHNAME()'函數來顯示名稱 –

+0

你如何得到中位數,AFAIK MySQL沒有爲此提供聚合函數(如你使用GROUP BY所暗示的那樣)? – Vlad

+0

現在我正要通過使用嵌套選擇來獲取整個數據集的中位數。我真正喜歡的是每月數據的中位數。在上面編輯併發布查詢。 –

回答

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將幫助您確定最正確的值(這是中位數)
+1

group_concat_max_len通常設置爲1024,因此您的數據將被截斷爲1024.此示例僅適用於非常小的數據集。 – velcrow

+0

您可以隨時爲group_concat_max_len設置較大的值 – ajreal

1

Peolple at the mysql's aggregate functions discussion page以臨時表結束。在那裏搜索「中位數」。

+0

這顯示瞭如何獲得中位數是,但我正在尋找的是每月中位數。 –

+1

在臨時表中創建一個月一組,並且每個月都會有一個medain。 – J0HN