sql >> データベース >  >> RDS >> Mysql

MySQLのMAX、MIN、およびAVG関数と一緒にMEDIANを使用する

    中央値関数が組み込まれていない場合でも、MySQLでGROUPBYを使用して中央値を計算できます。

    表を検討してください:

    Acrington   200.00
    Acrington   200.00
    Acrington   300.00
    Acrington   400.00
    Bulingdon   200.00
    Bulingdon   300.00
    Bulingdon   400.00
    Bulingdon   500.00
    Cardington  100.00
    Cardington  149.00
    Cardington  151.00
    Cardington  300.00
    Cardington  300.00
    

    行ごとに、類似したアイテムの数が少ない数を数えることができます。以下の値の数を数えることもできます:

    name        v       <   <=
    Acrington   200.00  0   2
    Acrington   200.00  0   2
    Acrington   300.00  2   3
    Acrington   400.00  3   4
    Bulingdon   200.00  0   1
    Bulingdon   300.00  1   2
    Bulingdon   400.00  2   3
    Bulingdon   500.00  3   4
    Cardington  100.00  0   1
    Cardington  149.00  1   2
    Cardington  151.00  2   3
    Cardington  300.00  3   5
    Cardington  300.00  3   5
    

    クエリあり

    SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                 , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
      FROM sale o
    

    中央値は、以下のカウントがアイテム数の半分の場合に発生します

    • アクリントン 4つのアイテムがあります。この半分は2で、範囲は0..2(200.00に対応)であり、範囲は2..3(300.00に対応)です

    • ブリンドン 4つのアイテムもあります。 2は1..2(値300.00)から2..3(値400.00)の範囲にあります

    • カーディントン 5つのアイテムがあります。値2.5は2から3の間で、Cardington151に対応します。

    中央値は、次の値によって返される最小値と最大値の平均です。

    SELECT cs.name,v
       FROM
       (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                     , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
          FROM sale o) cs JOIN
       (SELECT name,COUNT(1)*.5 as cn
          FROM sale
          GROUP BY name) cc ON cs.name=cc.name
     WHERE cn between ls and lse
    

    与えるもの:

    Acrington   200.00
    Acrington   200.00
    Acrington   300.00
    Bulingdon   300.00
    Bulingdon   400.00
    Cardington  151.00
    

    最後に、中央値を取得できます:

    SELECT name,(MAX(v)+MIN(v))/2 FROM
    (SELECT cs.name,v
       FROM
       (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                     , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
          FROM sale o) cs JOIN
       (SELECT name,COUNT(1)*.5 as cn
          FROM sale
         GROUP BY name) cc ON cs.name=cc.name
     WHERE cn between ls and lse
     ) AS medians
    GROUP BY name
    

    与える

    Acrington   250.000000
    Bulingdon   350.000000
    Cardington  151.000000
    


    1. パラメータ(connectstring、user、passwort ...)を使用してコマンドラインからSQLDeveloperを開きます。

    2. ユーザーがアップロードした画像をファイルシステムに効率的に保存する

    3. 差分日付間-SQLplus

    4. 文字セットのエンコーディングとストレージサイズの要素