簡體   English   中英

MySQL,同時在內部和外部查詢中進行分組

[英]MySQL, group by in both inner and outer query at the same time

進行如下查詢:

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

但是如何在內部查詢和外部查詢中按位置分組,因此內部查詢where子句返回與正確位置匹配的值。

謝謝。

您正在尋找GROUP BY 要獲得每個頭寸的平均價格,而不僅僅是一個頭寸的平均價格,這就是您要做的。

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

您的查詢中有兩個西格瑪排除。 您需要使用相同的技術來獲取每個頭寸的限制。 如果要計算每個位置的平均值+ 2 sigma限制,則需要此子查詢。 注意 :最好在SQL之類的語言中使用括號,而不是信任算術運算符的優先級。)

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

然后,您可以像這樣將查詢加入您的頂級選擇中

 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

這樣就可以為您提供倉位/價格的原始數據(不包括異常值)。 您是否看到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

查詢中這種子查詢的分層就是為什么將其稱為結構化查詢語言。

不能添加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;

尚不清楚應使用哪個列進行關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM