Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Oracle SQL在最接近的值中查找中间值_Sql_Oracle - Fatal编程技术网

使用Oracle SQL在最接近的值中查找中间值

使用Oracle SQL在最接近的值中查找中间值,sql,oracle,Sql,Oracle,我有一组由定期收集的值组成的数据。我想为集合的每个元素使用当前值的两个左右邻域来计算中值 例如,集合为: 21 22 23 -10 20 22 19 21 100 20 对于第一个值,我们选择21、22、23,中间值为22。因此,对于21个,我们有22个。对于-10,我们有22,23,-10,20,22。中位数是22 我使用此方法来消除此集合中异常的异常值 我想我应该用中值分析函数。诸如此类: 选择SELECT mediand.value 从我的 其中d.key\u val=s.key\u v

我有一组由定期收集的值组成的数据。我想为集合的每个元素使用当前值的两个左右邻域来计算中值

例如,集合为:

21
22
23
-10
20
22
19
21
100
20
对于第一个值,我们选择21、22、23,中间值为22。因此,对于21个,我们有22个。对于-10,我们有22,23,-10,20,22。中位数是22

我使用此方法来消除此集合中异常的异常值

我想我应该用中值分析函数。诸如此类:

选择SELECT mediand.value 从我的 其中d.key\u val=s.key\u val 和d.order_值介于s.order_值-2和s.order_值+2中间值之间 ,s.key_val ,s.order_值 从我的
<>我很乐意看到任何其他方法或一些改进的方法来解决这个问题。

< P>你没有指定任何关于你的表结构的东西,所以我只是猜测你的SQL有哪些字段以及它们应该意味着什么,但是考虑一下这样的尝试:

SELECT s1.key_val, s1.order_value, s1.value, MEDIAN(s2.value) as med
FROM my_set s1
LEFT OUTER JOIN my_set s2
  ON s2.key_val = s1.key_val
  AND (s1.order_value - 2) <= s2.order_value
  AND s2.order_value       <= (s1.order_value + 2)
GROUP BY s1.key_val, s1.order_value, s1.value

如果新值与前一个值的差值超过了X的合理值,那么忽略这些值如何?如果这些值是温度,您可以确定两次测量之间的温度变化不可能超过,比如说5摄氏度。@Roman。您的方法可能是最简单的解决方案。Oracle不支持分区子句中带有ORDER BY的中值或百分位数。@JimmyB不,实际上它是数据库中表的大小增加。有时我们清理表或插入额外的数据,这样这些操作就不会影响表的整体增长。因此,没有合理的预置量,这就是为什么我要计算它,然后检查新值是否在有效范围内。通过使用两个左右邻域,指的是根据一定要订吗?集合不定义值的顺序,因此您应该指定您定义为邻居的内容。看起来这是不进行分析的最简单的方法