0

有一个这样的 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 子句返回一个与正确位置匹配的值。

谢谢。

4

2 回答 2

1

你正在寻找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

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

于 2017-01-06T12:21:17.597 回答
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;

只是不清楚应该使用哪一列进行关联。

于 2017-01-06T12:11:55.010 回答