選択したいMySQLテーブルがあります:
1)一般的な値がある場合は、「最も発生している」値のいずれか
2)または、最も発生する値がない場合は「平均」値。
表1の例:
value
1
2
3
4
すべての値が等しく発生するので、私は取りたいですAVG(`value`)
表2の例:
value
1
2
2
3
値2
が優先されるため、値2を選択します。
どのmysqlクエリがこれを行いますか?
選択したいMySQLテーブルがあります:
1)一般的な値がある場合は、「最も発生している」値のいずれか
2)または、最も発生する値がない場合は「平均」値。
表1の例:
value
1
2
3
4
すべての値が等しく発生するので、私は取りたいですAVG(`value`)
表2の例:
value
1
2
2
3
値2
が優先されるため、値2を選択します。
どのmysqlクエリがこれを行いますか?
Gordonの回答から始めて、SQLFiddleでSQLクエリをテストして修正しました。
SELECT IF(t4.numcnts = 1, t1.avgvalue, t2.topvalue) AS result
FROM (select avg(value) as avgvalue from test) t1
CROSS JOIN (select value as topvalue from test group by value order by count(*) desc limit 1) t2
CROSS JOIN join (select count(distinct cnt) as numcnts from
(select count(*) as cnt from test group by value) t3) t4
これが2つのテストテーブルを備えたフィドルです(特定の値が優先される場合に結果を確認するには、テスト用にtest2を切り替えます):http ://sqlfiddle.com/#!2/76914/3
私の変更は、句でステートメントのIF
代わりに使用し、副選択に必要なテーブルエイリアスを追加することでした。CASE
SELECT
次のアプローチでは、両方の値を計算してから、どちらかを選択します。
select (case when numcnts = 1 then avgvalue else topvalue end)
from (select avg(value) as avgvalue from t) cross join
(select value as topvalue from t group by value order by count(*) desc limit 1) cross join
(select count(distinct cnt) as numcnts from (select count(*) as cnt from t group by value))
注:トップに同点があるが、他の値もある場合は、任意の値が返されます。この場合、何をするかを指定しません。
また、SQLはテストされていないため、構文エラーが発生する可能性があります。