当前位置: 首页 > 面试题库 >

消除子查询的平均值

欧阳俊晖
2023-03-14
问题内容

寻求

该查询选择所有以“ Vancouver”开头的点,并且距所有以“
Vancouver”开头的位置的中心相距5分钟以内。例如,温哥华南弗雷泽(Vancouver South Fraser),温哥华锦绣(Vancouver
Fairview)和温哥华巴兰特里广场(Vancouver Ballantree Place
W)在其平均纬度和经度的5分钟内具有纬度和经度。纬度和经度存储为(4915,12311)整数对(表示49.15’N和123.11’W)。

SQL代码

以下SQL令人讨厌的技巧:

SELECT
  NAME
FROM
 STATION
WHERE
      DISTRICT_ID = '110'
  AND NAME LIKE 'Vancouver%'
  AND LATITUDE BETWEEN
    (SELECT round((min(LATITUDE) + max(LATITUDE)) / 2)-5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
    and
    (SELECT round((min(LATITUDE) + max(LATITUDE)) / 2)+5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
  AND LONGITUDE BETWEEN
    (SELECT round((min(LONGITUDE) + max(LONGITUDE)) / 2)-5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
    and
    (SELECT round((min(LONGITUDE) + max(LONGITUDE)) / 2)+5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
ORDER BY
  LATITUDE

问题

如何在不使用视图的情况下简化此查询以删除冗余?

限制

该数据库是MySQL,但ANSI SQL总是不错的。

谢谢!


问题答案:
select 
  name
from 
  (select 
    round((min(LATITUDE) + max(LATITUDE)) / 2) as LATITUDE,
    round((min(LONGITUDE) + max(LONGITUDE)) / 2) as LONGITUDE
   from STATION 
   where DISTRICT_ID = '110' 
     AND NAME LIKE 'Vancouver%') AS center
  inner join STATION s
where
  s.DISTRICT_ID = '110' 
  and s.NAME like 'Vancouver%'
  and s.LATITUDE between center.LATITUDE - 5 and center.LATITUDE + 5
  and s.LONGITUDE between center.LONGITUDE - 5 and center.LONGITUDE + 5


 类似资料:
  • 问题内容: 我有一个包含列A和C的表T,我想从中检索一个平均计数,如下所示: 如何在GORM中完成此任务?GRAILS 2.2.0版我尝试按照文档进行操作,但是没有好的示例。我什至无法使子查询工作:( 我能够使计数部分起作用。现在仍要确定如何获得平均值,因为我不知道如何从查询中进行选择。 问题答案: 这是在HQL中完成的。使用我的域之一在grails控制台中进行了测试:

  • 问题内容: 我想知道是否可以在一个SQL SERVER请求中获得总和的平均值, 尝试使用以下请求来执行此操作,但是它不起作用: 问题答案: 我认为您的问题需要一些解释。如果要取分组的总和,可以使用: 然后,如果要取该总和的平均值,则只需进行以下操作: 但是,您无法对外部查询进行分组,因为这将为您提供类似于第一个查询的结果。内部查询的结果已按分组。

  • 问题内容: 我试图使用没有结果的过滤查询删除一些子行: 我得到了错误。 全栈跟踪: 我无法找到问题所在。 任何想法? 问候 问题答案: 在查找您的异常发生的源之后,我建议尝试以下操作: 请参阅delete方法的文档以了解其含义。传递参数将基本上运行查询两次,一次为选择,一次为删除。 如果运行两个查询是不希望的,通过代替,然后调用立即删除后,以避免不一致的状态的内部存储。

  • 我有一个正整数数组。例如: 一个“约简操作”找到平均值最高的数组前缀,并将其删除。这里,数组前缀是指左端为数组开始的连续子数组,如上面的或或。通过取较长的前缀来打破联系。 我将重复缩减操作,直到阵列为空: 现在,实际上执行这些数组修改是没有必要的;我只是在寻找这个过程将删除的前缀长度列表,例如上面的。 计算这些前缀长度的有效算法是什么? 最简单的方法是重新计算算法的每次迭代中的所有总和和平均值——

  • 问题内容: 我有一列的数据像 我需要编写一个SQL查询/过程,这将有助于我获取日期之间差异的平均值。对于上面的示例,它将是 (19 + 8 + 10)/3=12.33。 请提供帮助。 在此先感谢Geetha 问题答案: 我不知道您的RDBMS,但这是来自SQL Server。另外,您的计算之一是错误的-02/09/2011-13/08/2011是20,而不是19。 产生的结果是12.667:(20

  • 我需要更改我的架构吗,还是可以使用当前的设置来更改?