2017-01-06 12 views
0

はこのようなSQLクエリ持っている:あなただけ一度に一つの位置を確認したいが、私はかなりの数を持っている場合MySQLの、両方の内側と外側のクエリ内でグループを同時に

SELECT position, AVG(price) FROM products WHERE position IS NOT NULL 
AND price < (SELECT AVG(price)+2*STDDEV(price) FROM price) 
AND position = 3 

ニース私は同時にすべてのポジションのデータを取得したいと考えています。

すなわち、のようなもの:

[QUERY]... GROUP BY position 

しかし、どのように節が正しい位置に一致する値を返し内側と外側のクエリなので、そこに内部クエリの両方での位置によってIグループ行います。

ありがとうございました。

+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

+0

-1の評価はなぜですか? – Louisa

+0

下向き矢印にカーソルを合わせる – Strawberry

答えて

1

あなたはGROUP BYを探しています。 1つのポジションだけでなく各ポジションの平均価格を取得するには、ここで行うことがあります。

SELECT position, AVG(price) average 
    FROM products 
GROUP BY position 

あなたの質問には2シグマの除外があります。あなたはそれぞれの位置の限界を得るために同じテクニックを使用する必要があります。各ポジションの平均+2シグマ制限を計算する場合は、このサブクエリが必要です。 (:それはむしろ、算術演算子の優先順位を信頼するよりも、SQLのような言語では括弧を使用するのがベストです。)あなたはそのように

SELECT a.position, a.price 
    FROM products 
    JOIN (
       SELECT position, 
         AVG(price) + (2.0 * STDDEV(price)) upper_limit 
        FROM products 
        GROUP BY position 
     ) b ON a.position = b.position 
      AND a.price < b.upper_limit 

のように選択し、あなたのトップレベルにそのクエリに参加することができます

    SELECT position, 
         AVG(price) + (2.0 * STDDEV(price)) upper_limit 
        FROM products 
        GROUP BY position 

これにより、外れ値を除いたポジション/価格の生データが得られます。 ON句は、メインとサブクエリの行の位置がどのように一致するかを確認してから、ロー価格がupper_limitを超えるローを除外しますか?それはトリックです。

次に、そのデータを通常のGROUP BYに集約できます。それは構造化クエリ言語と呼ばれる理由

SELECT a.position, AVG(a.price) average 
    FROM products 
    JOIN (
       SELECT position, 
         AVG(price) + (2.0 * STDDEV(price)) upper_limit 
        FROM products 
        GROUP BY position 
     ) b ON a.position = b.position 
      AND a.price < b.upper_limit 
    GROUP BY a.position 

クエリ内のサブクエリのこのレイヤーです。

+0

パーフェクト。どうもありがとう! – Louisa

0

追加しないでくださいGROUP BYあなたは何をしたいですか?

SELECT position, AVG(price) 
FROM products p 
WHERE position IS NOT NULL AND 
     price < (SELECT AVG(price)+2*STDDEV(price) 
       FROM price p2 
      ) 
GROUP BY position; 

また、気になる特定の製品はありますか?その場合、相関サブクエリが必要です。

SELECT position, AVG(price) 
FROM products p 
WHERE position IS NOT NULL AND 
     price < (SELECT AVG(price)+2*STDDEV(price) 
       FROM price p2 
       WHERE p.? = p2.? 
      ) 
GROUP BY position; 

相関関係に使用する列は不明です。

+0

ありがとうございますが、トップクエリはstddevを現在の位置(つまり、私たちがグループ化している位置)に限定しません。 したがって、現在の位置に対してstddevをフィルタリングする代わりに、テーブル内のすべての行のstddevをフィルタリングします。 – Louisa

関連する問題