7

平均ではなく、値のリストの中央値を計算するのに問題があります。

この記事を見つけまし た 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列があり、中央値を計算したい場合、列xy列は何を参照していますか?

4

7 に答える 7

11

より速い方法を提案します。

行数を取得します。

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(*)*nn

于 2011-05-31T00:08:30.307 に答える
2

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 回計算するサブクエリを作成します。これとは別に、別の解決策は見当たりません。これは、より良い方法がないという意味ではありません。他の誰かがアイデアを思い付くかもしれません。

于 2011-03-23T05:23:48.443 に答える
1

まず、中央値とは何かを理解しようとします。これは、並べ替えられた値のリストの中央の値です。

それを理解したら、アプローチは2つのステップです。

  1. 値をいずれかの順序で並べ替える
  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)

したがって、日付を並べ替えるには数値が必要です。それらのタイム スタンプを (エポックからの経過秒数として) 取得し、中央値の定義を使用できます。

于 2011-03-23T05:29:40.107 に答える
1

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 関数を使用するのに役立ちます。

カウントに基づいて、偶数または奇数の値が決定されます。

  • 奇数値: substring_index を使用して、pos に属する要素を直接選択します。
  • 偶数値: pos と pos+1 に属する要素を見つけ、それらを加算して 2 で割り、中央値を取得します。

最後に、中央値が計算されます。

于 2014-12-03T13:45:32.720 に答える
1

私と私の友人が見つけた最も簡単な方法...お楽しみください!!

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);
于 2019-08-14T16:40:18.297 に答える
1

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 値は許可されません。

于 2015-11-25T13:22:56.840 に答える