【问题标题】:Finding median from sql query从sql查询中查找中位数
【发布时间】:2018-12-25 05:20:39
【问题描述】:

中位数定义为将数据集的上半部分与下半部分分开的数字。从 STATION 查询北纬 (LAT_N) 的中位数并将您的答案四舍五入到小数位。

输入格式

STATION表描述如下:

其中 LAT_N 是北纬,LONG_W 是西经。

我将查询写为:

select round(LAT_N,4) from (select LAT_N from station order by LAT_N) where ROWNUM = ((LENGTH(LAT_N)+1)/2);

我没有得到这个查询的输出。 谁能解释一下错误是什么?

【问题讨论】:

  • “错误答案”极不可能是来自 SQL 编译器的消息。 LENGTH() 函数与关系的基数完全不同,关系的基数必须使用 SELECT COUNT(*) FROM ... 您的解决方案是否可靠,取决于 ROWNUM 始终等于行的等级,可能不确定.
  • 您使用哪个数据库服务器?请使用适当的标签。
  • 我很想知道返回“错误答案”这样有趣的错误消息的编译器是什么:)
  • @DraganJovanović 甲骨文。我在网上练习。
  • @JoakimDanielson 对不起,我的错。编译器不会将错误答案作为错误抛出。因为我在网上练习所以它只是检查正确的输出。

标签: sql oracle


【解决方案1】:

在Oracle中,可能最简单的方法是使用median()

select median(LAT_N) 
from stations;

【讨论】:

  • 谢谢.. 但你能解释一下我的查询出了什么问题吗?
  • @AayushChachan rownum 在返回行时被分配给行,因此第一行是 1,下一行是 2,依此类推。因此像 where rownum = 2 这样的谓词永远不会为真。此外,length(lat_n) 返回字符串中的字符数(例如 length('xyz') 返回 3),而不是集合中的行数。
【解决方案2】:

试试这个方法:

select top 1 a.LAT_N, count(*) biggerThan
from
(select LAT_N from station) a join (select LAT_N from station) b on a.LAT_N > b.LAT_N
    join (select count(*) countt from station) counterr on 1 = 1
group by a.LAT_N, counterr.countt
having count(*) > counterr.countt/2 - 1
order by biggerThan

它返回大于大约一半集合成员的最小值。 我已将“大约一半”定义为 countt/2 - 1,您应该对这部分逻辑更准确。

【讨论】:

  • 我们为什么要对这个问题进行这么长的查询?
  • 我不知道标准 sql 中的较短解决方案,我想看看。在我开始制作这个解决方案时,没有关于 Oracle 服务器的信息。
  • 很抱歉遗漏了oracle标签
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 2018-03-07
  • 1970-01-01
  • 2013-08-08
  • 2016-07-06
  • 2019-09-01
  • 2020-10-17
相关资源
最近更新 更多