首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Select中重用聚合

问在Select中重用聚合
EN

Stack Overflow用户
提问于 2018-05-31 02:26:13
回答 2查看 94关注 0票数 0

在下面的查询中,SQL是否需要计算两次SUM(MY_INDICATOR) (每个使用它的字段计算一次),还是优化为只执行一次聚合?

代码语言:javascript
复制
SELECT
  ID,
  SUM(MY_INDICATOR) AS MY_SUM,
  SUM(MY_INDICATOR) / COUNT(*) AS MY_RATE
FROM
  SOMETABLE
GROUP BY
  ID

更新:在查看一些执行计划Thorsten是正确的之后,SQL Server优化器将生成一个只需要执行一次SUM(MY_INDICATOR)的执行计划。不需要CTE来优化查询。

EN

回答 2

Stack Overflow用户

发布于 2018-05-31 03:35:38

您所担心的优化是相当不相关的。聚合查询的开销在于读取数据并对其进行重新排列,以便可以同时处理公共键值。简单的sum()不是性能问题。

也就是说,假设my_indicator不是NULL,您可以将逻辑简化为:

代码语言:javascript
复制
SELECT ID, SUM(MY_INDICATOR) AS MY_SUM,
       AVG(MY_INDICATOR * 1.0) AS MY_RATE
FROM SOMETABLE
GROUP BY ID;

* 1.0是因为SQL Server执行整数运算--为了避免这种情况(即使在您的版本中也是如此),您希望将其转换为带有小数位的数字格式。

我经常把这个逻辑写成:

代码语言:javascript
复制
avg(case when my_indicator = 1 then 1.0 else 0 end)
票数 0
EN

Stack Overflow用户

发布于 2018-05-31 02:29:06

它必须计算两次,你可以这样做,所以你只需要计算一次:

代码语言:javascript
复制
SELECT ID, MY_SUM, 
       MY_SUM / MY_COUNT AS MY_RATE
FROM ( SELECT ID,
              SUM(MY_INDICATOR) AS MY_SUM,
              COUNT(*) AS MY_COUNT
       FROM  SOMETABLE
       GROUP BY ID
     ) t;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50611260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档