MySQL, 同时在内部和外部查询中分组

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

有一个这样的SQL查询:

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 子句 return 匹配正确位置的值。

谢谢。

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

不清楚应该使用哪个列进行关联。

您正在寻找 GROUP BY。要获取每个仓位的平均价格,而不仅仅是一个仓位的平均价格,您可以按照以下步骤操作。

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

您的查询中有一个二西格玛排除项。您需要使用相同的技术来获得每个位置的限制。如果要计算每个位置的均值 + 2 西格玛限制,则需要此子查询。 (注意:最好在 SQL 这样的语言中使用括号,而不是相信算术运算符的优先级。)

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

然后您可以将该查询加入您的顶级 select,就像这样

 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

查询中子查询的这种分层是它被称为结构化查询语言的原因。