平均ではなく、値のリストの中央値を計算するのに問題があります。
この記事を見つけまし た MySQLで中央値を計算する簡単な方法
正しく理解できない次のクエリへの参照があります。
SELECT x.val from data x, data y
GROUP BY x.val
HAVING SUM(SIGN(1-SIGN(y.val-x.val))) = (COUNT(*)+1)/2
time
列があり、中央値を計算したい場合、列x
とy
列は何を参照していますか?
平均ではなく、値のリストの中央値を計算するのに問題があります。
この記事を見つけまし た MySQLで中央値を計算する簡単な方法
正しく理解できない次のクエリへの参照があります。
SELECT x.val from data x, data y
GROUP BY x.val
HAVING SUM(SIGN(1-SIGN(y.val-x.val))) = (COUNT(*)+1)/2
time
列があり、中央値を計算したい場合、列x
とy
列は何を参照していますか?
より速い方法を提案します。
行数を取得します。
SELECT CEIL(COUNT(*)/2) FROM data;
次に、ソートされたサブクエリで中央の値を取得します。
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
これを乱数の 5x10e6 データセットでテストしたところ、10 秒以内に中央値が見つかりました。
これは、 をパーセンタイル (中央値の場合は .5、75 パーセンタイルの場合は .75 など) に置き換えることCOUNT(*)/2
で、任意のパーセンタイルを見つけます。COUNT(*)*n
n
val
は時間列でx
ありy
、データ テーブルへの 2 つの参照です ( と書くことができますdata AS x, data AS y
)。
編集:合計を2回計算するのを避けるために、中間結果を保存できます。
CREATE TEMPORARY TABLE average_user_total_time
(SELECT SUM(time) AS time_taken
FROM scores
WHERE created_at >= '2010-10-10'
and created_at <= '2010-11-11'
GROUP BY user_id);
次に、名前付きテーブルにあるこれらの値の中央値を計算できます。
編集:一時テーブルはここでは機能しません。「MEMORY」テーブルタイプの通常のテーブルを使用してみてください。または、クエリで中央値の値を 2 回計算するサブクエリを作成します。これとは別に、別の解決策は見当たりません。これは、より良い方法がないという意味ではありません。他の誰かがアイデアを思い付くかもしれません。
まず、中央値とは何かを理解しようとします。これは、並べ替えられた値のリストの中央の値です。
それを理解したら、アプローチは2つのステップです。
例:
Median of 0 1 3 7 9 10: 5 (because (7+3)/2=5)
Median of 0 1 3 7 9 10 11: 7 (because 7 is the middle value)
したがって、日付を並べ替えるには数値が必要です。それらのタイム スタンプを (エポックからの経過秒数として) 取得し、中央値の定義を使用できます。
group_concatを使用してmysqlで中央値を見つける
クエリ:
SELECT
IF(count%2=1,
SUBSTRING_INDEX(substring_index(data_str,",",pos),",",-1),
(SUBSTRING_INDEX(substring_index(data_str,",",pos),",",-1)
+ SUBSTRING_INDEX(substring_index(data_str,",",pos+1),",",-1))/2)
as median
FROM (SELECT group_concat(val order by val) data_str,
CEILING(count(*)/2) pos,
count(*) as count from data)temp;
説明:
並べ替えは、group_concat 関数内で order by を使用して行われます
位置 (pos) と要素の総数 (count) が識別されます。位置を識別する CEILING は、以下の手順で substring_index 関数を使用するのに役立ちます。
カウントに基づいて、偶数または奇数の値が決定されます。
最後に、中央値が計算されます。
私と私の友人が見つけた最も簡単な方法...お楽しみください!!
SELECT count(*) INTO @c from station;
select ROUND((@c+1)/2) into @final;
SELECT round(lat_n,4) from station a where @final-1=(select count(lat_n) from station b where b.lat_n > a.lat_n);
R
という名前の列を持つテーブルがあり、 AA
の中央値が必要な場合は、次のように実行できます。
SELECT A FROM R R1
WHERE ( SELECT COUNT(A) FROM R R2 WHERE R2.A < R1.A ) = ( SELECT COUNT(A) FROM R R3 WHERE R3.A > R1.A )
注: これは、A に重複する値がない場合にのみ機能します。また、null 値は許可されません。