[英]Fill the Gap of missing data in table with smooth average using oracle query
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列中缺少的列-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 如何在oracle中的兩個間隔之間傳播平均值
然而,在這個問題中,間隔的長度並不固定。
我認為這只是一個含有大量分析函數的表達式。
您可以通過僅對有效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)
。 我不包括那個,因為我認為這只會使表達的重要部分復雜化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.