如何选择中值? [复制]

Posted

技术标签:

【中文标题】如何选择中值? [复制]【英文标题】:How to select median value? [duplicate] 【发布时间】:2019-02-14 04:54:18 【问题描述】:

谁能给我一个提示,如何在 12.04.18 - 16.04.18 期间找到“税”的中值:

user_id  login_time  tax
3       2018-04-15   16625000
5       2018-04-16      
6       2018-04-17   296470000
6       2018-04-16   192519750
6       2018-04-15   4455500
6       2018-04-13   17125
6       2018-04-12   120180000
7       2018-04-18   24060000
7       2018-04-17   42959500

结果等于16625000(因为有NULL值,我们需要把它当作0)。

感谢您关注我的问题!

【问题讨论】:

SELECT AVG(NVL(tax, 0)) from ...? @SMA:中位数与均值不同(也称为平均值)。 AVG 给出的是平均值,而不是中位数。 【参考方案1】:

中位数是值

恰好位于奇数数据集的中间。 或偶数数据集中两个中间值的平均值。

因此,通过考虑这两种情况,您首先需要的是数据行数。然后,您必须决定(简单情况)是选择中间的值,还是需要两个值的平均值(不要忘记在选择实际值之前应用排序):

我会使用一些“代码”来实现这一点:

伪代码:

1.) SELECT count(id) AS val FROM myTable WHERE datetime ... //$val=9
2.) Programming language: $lim = floor($val/2); // $lim=4

if odd($val)
  3.) SELECT tax FROM myTable WHERE datetime [...] ORDER BY tax LIMIT $lim,1 


else if even($val)
  3.) Programming language: $lim -=1; // if $val was 10, we want row 4 and 5
  4.) SELECT AVG(tax) AS tax FROM 
       (SELECT * FROM myTable WHERE datetime [...] ORDER BY tax LIMIT $lim,2) AS tmp

[...]
echo "Median is: ". $row["tax"];

【讨论】:

谢谢,不使用$可以解决这个问题吗? @ЕлисейГорьков 当然,这只是变量声明的一个例子。您应该使用您的编程语言支持的声明。 我使用了你的提示,但我遇到了困难。这是我的查询: 1) SELECT count(user_id) from activity where login_time between '2018-04-12' 和 '2018-04-16'; 2) SELECT tax from activity where login_time between '2018-04-12' and '2018-04-16' order by tax; 3) SELECT AVG(tax) as tax from (select * from activity where login_time between '2018-04-12' and '2018-04-16' order by tax) d;这里有什么问题? @ЕлисейГорьков 很难说,你能用你从每个查询中得到的结果更新你的初始帖子吗?然后我们也许能够弄清楚出了什么问题。 LIMIT 部分在这里很重要,因为它决定了从数据库中获取哪些值!

以上是关于如何选择中值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 内核中的中值选择

如何在 Navicat 复制和粘贴数据

选择不同的经度和纬度值并找到它们的中值

您如何选择最新日期的值? [复制]

如何选择产品的最新价格? [复制]

如何从选择中获取价值? [复制]