2016-05-07 7 views
0

の中央値を計算し、私は派生フィールドの中央値を計算しようとしています:のMySQL:タイトルごとの派生値

SELECT 
    TIMESTAMPDIFF(DAY, T1.time1, T2.time2) as diff 
FROM table1 T1 JOIN table2 T2 ON ... 
WHERE ... 
GROUP BY ... 

平均を計算することが

SELECT 
    AVG(F.diff) as average 
FROM (
    //subquery above 
) F; 

のと同じくらい簡単ですほとんどの解決法は列のテーブルをそれ自体に結合することを含むように、私は周りを探索することは中央値を計算する方法を考え出していない。私がそれを行う唯一の方法は、サブクエリを2回出力することです。このサブクエリは非常に速いものではありません。誰かがMySQLが冗長性を最適化し、サブクエリを1回だけ実行することを確認できない限り、私は本当にその解決策を避けたいと思います。

答えて

0

group_concat()を使用してトリックがありますが、(中間の文字列長のために)機能しない可能性があります。より良い方法は、単純に列を列挙し、条件付き集計を使用することです。悲しいかな、これには2つのレベルの列挙が必要です:

SELECT TIMESTAMPDIFF(DAY, T1.time1, T2.time2) as diff, 
     AVG(CASE WHEN 2*@rn IN (cnt - 1, cnt, cnt + 1 THEN value END) as median 
FROM (SELECT *, 
      (@max := if(@g = concat_ws(':', <group by columns>>), @max, 
         if(concat_ws(':', <group by columns>>), rn, rn) 
         ) 
      ) as cnt 
     FROM (SELECT . . ., 
        (@rn := if(@g = concat_ws(':', <group by columns>>), @rn + 1, 
           @g := concat_ws(':', <group by columns>>), 1, 1) 
          ) 
        ) as rn 
      FROM table1 T1 JOIN table2 T2 ON ... CROSS JOIN 
       (SELECT @g := '', @rn := 0) params 
      WHERE ... 
      ORDER BY <group by columns>, <ordering column> 
      ) t CROSS JOIN 
      (SELECT @g1 := '', @max := -1) params 
     ORDER BY <group by columns>, <ordering column desc> 
    ) t 
GROUP BY ... 
関連する問題