1

選択したいMySQLテーブルがあります:

1)一般的な値がある場合は、「最も発生している」値のいずれか

2)または、最も発生する値がない場合は「平均」値。

表1の例:

value
1
2
3
4

すべての値が等しく発生するので、私は取りたいですAVG(`value`)

表2の例:

value
1
2
2
3

2が優先されるため、値2を選択します。

どのmysqlクエリがこれを行いますか?

4

2 に答える 2

1

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代わりに使用し、副選択に必要なテーブルエイリアスを追加することでした。CASESELECT

于 2013-01-12T03:05:43.990 に答える
0

次のアプローチでは、両方の値を計算してから、どちらかを選択します。

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はテストされていないため、構文エラーが発生する可能性があります。

于 2013-01-12T02:46:34.183 に答える