mysql - 从表 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
. 为什么给表起别名会使查询工作?
解决方案
这是您的查询:
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
-------------^
) =
这不是很有趣。您应该限定查询中的所有列引用。时期。那么你甚至不会问这个问题,因为你的代码在你写它的时候就可以工作了。
推荐阅读
- android - 如何使用 Mockk 测试 Intent 的 Bundle?
- css - 如何使用 CSS 隐藏除第一个子元素以外的所有子元素
- google-cloud-platform - 如何使用 terraform 部署私有 google cloudsql 实例,分配现有的 vpc(network_interface)
- python - 更新 Selenium 中的 Datepicker 元素值?
- checkmarx - Checkmarx 通过命令行扫描会引发错误
- django - 如何在 django 中为组模型的名称字段添加前缀
- reactjs - Material-UI 从状态设置类属性
- angular - 从选择 Angular 8.2 中获取价值。(表单生成器)
- javascript - 有没有办法延迟弹簧直到图像加载?
- xsl-fo - 天线屋无效属性值:column-width="proportional-column-width(4%)"