首页 > 解决方案 > 从表 T 中选择:计算中位数时此模式如何工作

问题描述

假设我有一个STATION带有 column的表LAT_N。该LAT_N列具有奇数个值。我试图找到这个特定场景LAT_N中值的中位数。这个问题不是关于在所有可能的情况下(奇数或非奇数值)中找到中位数。

我正在尝试了解此解决方案的工作原理/原因:

select round(S.LAT_N, 4) from STATION as S where (select count(LAT_N) from STATION where LAT_N < S.LAT_N ) = (select count(LAT_N) from STATION where LAT_N > S.LAT_N)

更具体地说,我想知道为什么我想出的解决方案不起作用:

select round(STATION.LAT_N, 4) from STATION where (select count(LAT_N) from STATION where LAT_N < STATION.LAT_N ) = (select count(LAT_N) from STATION where LAT_N > STATION.LAT_N)

第一个查询返回一个唯一值(右侧),第二个查询返回一个值列表。

似乎关键概念是与from STATION as S. 为什么给表起别名会使查询工作?

标签: mysqlsql

解决方案


这是您的查询:

select round(STATION.LAT_N, 4) 
from STATION
where (select count(LAT_N)
       from STATION
       where LAT_N < STATION.LAT_N
      ) =
      (select count(LAT_N)
       from STATION
       where LAT_N > STATION.LAT_N
      );

让我用表别名重写它:

select round(s.LAT_N, 4) 
from STATION s
where (select count(LAT_N)
       from STATION s2
       where LAT_N < s2.LAT_N
      ) =
      (select count(LAT_N)
       from STATION s3
       where LAT_N > s3.LAT_N
      );

对于这个子查询,您认为它LAT_N神奇地引用了外部查询:

where (select count(LAT_N)
       from STATION s2
       where LAT_N < s2.LAT_N
-------------^
      ) =

或者也许我把它弄反了,你认为对方指的是。但也不行。这个查询很简单:

where (select count(LAT_N)
       from STATION s2
       where s2.LAT_N < s2.LAT_N
-------------^
      ) =

这不是很有趣。您应该限定查询中的所有列引用。时期。那么你甚至不会问这个问题,因为你的代码在你写它的时候就可以工作了。


推荐阅读