CREATE TABLE T(ID NUMBER, X NUMBER, Y NUMBER);
INSERT INTO T(ID,X) VALUES(1,10);
INSERT INTO T(ID) VALUES(2);
INSERT INTO T(ID,X) VALUES(3,33);
INSERT INTO T(ID,X) VALUES(4,20);
INSERT INTO T(ID) VALUES(5);
INSERT INTO T(ID) VALUES(6);
INSERT INTO T(ID) VALUES(7);
INSERT INTO T(ID,X) VALUES(8,11);
INSERT INTO T(ID) VALUES(9);
INSERT INTO T(ID) VALUES(10);
INSERT INTO T(ID,X) VALUES(11,10);
当前表:
ID X Y
---------------------------
1 10
2
3 33
4 20
5
6
7
8 11
9
10
11 10
期望的输出:
ID X Y
---------------------------
1 10
2 21.5
3 33
4 20
5 17.75
6 15.5
7 13.25
8 11
9 10.67
10 10.34
11 10
在上表中,列-x缺少值。 我想使用一些数学计算填充x列中的缺失值
row_count =在区间(x1,x2)之间的x中具有空值的行的数量 step =(x2-x1)/(row_count + 1)
column-x = PrevRowValue +/- step
的nextRowValue我使用上面的计算填充了-Y列中缺失的column-x值。例如
(x1,x2)=(11,20)
row_count=row with id (5,6,7) = 3
step=(20-11)/(3+1)=2.25
we get 3 missing value for id (5,6,7) as
20-2.25=17.75
17.75-2.25=15.5
15.5-2.25=13.25
我问了一个类似的问题,在链接下面的stackoverflow上间隔被固定为60 How to spread the average between two intervals in oracle
在这个问题中,间隔的长度并不固定。
答案 0 :(得分:3)
我认为这只是一个含有大量分析函数的表达式。
您可以通过仅对有效x值进行累积计数来识别给定x的组,后跟空值。对于该组,该组中x的最小(或最大)值是第一个值。
使用count(*) over
给出值的数量。您可以使用row_number()
枚举它们。获得下一个值是一个小技巧。此查询使用lead( ignore nulls)
,这需要Oracle 11 +。
其余的只是算术。如果我有正确的话,那就是:
select t.*,
( (row_number() over (partition by xgrp order by id) - 1) /
count(*) over (partition by xgrp)
) *
(next_x - min(x) over (partition by xgrp)) +
min(x) over (partition by xgrp)
from (select t.*, count(x) over (order by id) as xgrp,
lead(x ignore nulls) over (order by id) as next_x
from t
) t;
当x值(case when x is null then . . . end)
已经存在时,您需要额外的逻辑来忽略值。我不包括这个因为我认为这只会使表达的重要部分复杂化。