1

データ例

この例では、すべての組み合わせに対して平均的な煙柱が必要です。ここで物事が複雑になります。

(Male,30-40,us)、(Male,30-40,ca)、(Male,30-40,th)などの平均(煙)を見つけるのは簡単ではありません。

私が欲しいのは、 (Male,30-40,(us,uk)) ,(Male,30-40,(us,uk,th)) ,,( のような単一のクエリで複数回使用できる変数です男性、30 ~ 40 歳、(us、uk、th、ca)) など。

簡単で効率的な方法はありますか?

4

3 に答える 3

0

簡単な方法は、独立変数/予測変数を別の列の文字列として連結し、文字列の GROUP BY に基づいて AVG(煙) を取得することです

ALTER TABLE `statistical_data` ADD `variables_string` VARCHAR( 255 ) NOT NULL 

UPDATE `statistical_data` SET`variables_string` = CONCAT(`gender`, `age`, `country`)

SELECT `gender`, `age`, `country`, AVG(smoke) FROM `statistical_data`GROUP BY `variables_string`

たとえば、WHERE 句を使用して、すべての組み合わせの平均を取得できます。WHERE 性別は男性ですが、すべての組み合わせの煙の合計 (1 の数) を組み合わせの頻度 (n) で割る必要があります。平均の平均を取ることはできません。

SELECT (SUM(smoke_sum) / SUM(smoke_count)) FROM (SELECT `gender`, `age`, `country`, SUM(smoke) AS smoke_sum, COUNT(smoke) AS smoke_count FROM`statistical_data` WHERE `gender` = 'male' GROUP BY variables_string ) AS t2
于 2013-03-08T20:43:34.990 に答える
0

次のようなすべての組み合わせを取得できます。

SELECT q.sort_key,avg(s.id)
FROM foo AS s
JOIN
  (SELECT GROUP_CONCAT(f0.bar) AS sort_key
   FROM foo AS f1
   JOIN foo AS f2 ON f1.bar<=f2.bar
   JOIN foo AS f3 ON f2.bar<=f3.bar
   JOIN foo AS f0 ON f0.bar=f1.bar OR f0.bar=f2.bar OR f0.bar=f3.bar
   GROUP BY f1.bar,f2.bar,f3.bar) AS q ON find_in_set(s.bar,q.sort_key)
GROUP BY q.sort_key;

http://sqlfiddle.com/#!2/1fdbf/32

MySQL は再帰的な CTE をサポートしていないため、そのパラメーターの異なる値が存在する可能性がある限り多くのテーブルを使用する必要があります (性別は 2、国は 4(?) など)。すべてのパラメータで可能な組み合わせを取得したら、それらをデカルト結合してグループ化します。PHP では、(male,female) のようなソート キーを ALL GENDERS に変更するだけです。

EDIT2:重複を修正しました。おそらく結合の方が優れている可能性がありますが、それでも正常に機能します。

于 2013-03-08T17:14:16.473 に答える