【问题标题】:use min() and avg () in subquery在子查询中使用 min() 和 avg()
【发布时间】:2021-01-11 02:48:10
【问题描述】:

我正在使用 ibm cloud 和 sql 开发 db2。 我的数据包含 1 个包含 3 列的表:学校、它们的整体表现(水平)和位置。 我想使用带有 avg 和 min 的子查询来找到 AVERAGE 级别最低的位置。

我有这段代码可以完成这项工作:

select location, avg(level) as avglevel
from schools_table
group by location
order by avglvl
limit 1;

但我正在寻找类似的东西:

select location
from schools_table
where level = (select min(level) from schools_table);

这会产生所有值中的最小值。但是我对平均值的最小值感兴趣。

请帮忙 非常感谢您的任何见解。

阿图罗

【问题讨论】:

  • 您不喜欢使用order bylimit 的代码的什么地方?
  • 我有点迷路了。您在问题中提到了两个表。文本中表的描述与查询中使用的列不匹配。样本数据和期望的结果真的很有帮助。
  • 嗨!对不起,我把两张桌子混在一起了,你是对的。我已经修好了,我认为 fahmi 的答案正是我想要的。
  • @GMB,你说得对,我特别不喜欢极限线。我不想按顺序排列并限制为 1 行,而是想用 min() 函数得到答案。
  • 如果两个位置的平均水平相同并且都等于最小值怎么办?如果您使用limit,其中一个会丢失。

标签: sql db2 subquery average min


【解决方案1】:

你可以试试下面的-

with cte as
(
select location,avg(safety_score) as safety_score  from chicago_public_schools group by location
)
select community_area_name
from chicago_public_schools
where safety_score = (select min(safety_score) from cte)

【讨论】:

  • 谢谢!我想就是这样。我是 sql 的初学者,我不知道 with 语句。只是出于好奇,没有它可能吗?比如,不知何故,在子查询中生成该变量/新表 cte?
【解决方案2】:

我认为你只需要

select community_area_name
from chicago_public_schools
where safety_score = (select avg(safety_score)
                      from chicago_public_schools 
                      group by location
                      order by avg(safety_score) asc --sort the result
                      limit 1); --pick the smallest avg

现在..出于性能原因,我不建议这样做,但如果您真的想避免使用 order bylimit 并且不想使用 cte,您可以使用 @ 987654325@

select community_area_name
from chicago_public_schools
where safety_score = (select distinct min(avg(safety_score)) over()
                      from chicago_public_schools 
                      group by location)

如果你也想避免window functions,你可以完全依赖子查询,但是——它太丑了

select community_area_name
from chicago_public_schools a
join (select min(safety_score) as min_safety_score
      from (select avg(safety_score) as safety_score  
            from chicago_public_schools 
            group by location) b) c on a.safety_score = c.min_safety_score

【讨论】:

  • 您好,感谢您的回复!我正在寻找使用 min() 函数获得最低平均值的代码。您的方式与我在问题中的方式非常相似。但是,您设法在我也觉得有趣的子查询中实现它。再次感谢!
  • @arturo451 没问题,为了学习,我添加了另一个替代方案
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 2021-12-27
  • 2020-03-06
  • 2012-09-03
  • 2011-10-31
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多