有一个像这样的 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 子句返回与正确位置匹配的值。
谢谢。
最佳答案
您正在寻找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
查询中的子查询分层就是它被称为结构化查询语言的原因。
关于MySQL,同时在内部和外部查询中进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504561/