2011-08-08 22 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 

感謝したいと思います。

EDIT:現在のクエリ

は、これは私が全体の中央値を取得するには、今使っているクエリです、私は毎月、それを取得し、これを変換する方法を確認していません。

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はどのようにして集計関数を提供していませんか(GROUP BYを使用して暗示したように) – Vlad

+0

今は、ネストされた選択を使用してデータセット全体の中央値を取得しようとしています。私が本当に好きなのは、1か月あたりのデータの中央値です。上で編集してクエリを投稿してください。 –

答えて

1

あなたの値がfloatでいつもであれば...あなたはこれを試すことができます -

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

一時テーブルの作成に月ごとのグループを含めると、月ごとにメダインが作成されます。 – J0HN