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

标签 mysql sql group-by aggregate-functions subquery

有一个像这样的 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/

相关文章:

mysql - 使用 Mysql 查询的前十个计数

mysql - 按组合并行

MySQL count, left join, group by 返回零行

php - 在 MySQL 数据库中加密/解密密码

Mysql Match() Against() 不起作用

java - SQL 错误 : 0, SQLState:空

SQL Server 2008 查找和替换 XML 列中的元素

Mysql,一列值根据同一表中的另一列更改

java - 此 URL 不支持 HTTP 方法 GET,状态 405

mysql - 无需root更改时区mysql