你正在寻找GROUP BY
. 要获得每个职位的平均价格,而不仅仅是一个职位,您可以这样做。
SELECT position, AVG(price) average
FROM products
GROUP BY position
您的查询中有两个 sigma 排除项。您需要使用相同的技术来获得每个位置的限制。如果要计算每个位置的均值 + 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
查询中子查询的这种分层就是它被称为结构化查询语言的原因。