使用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不,实际上它是数据库中表的大小增加。有时我们清理表或插入额外的数据,这样这些操作就不会影响表的整体增长。因此,没有合理的预置量,这就是为什么我要计算它,然后检查新值是否在有效范围内。通过使用两个左右邻域,指的是根据一定要订吗?集合不定义值的顺序,因此您应该指定您定义为邻居的内容。看起来这是不进行分析的最简单的方法