簡體   English   中英

使用oracle查詢使用平滑平均值填充表中缺失數據的差距

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM