使用oracle查询

时间:2015-10-01 14:35:02

标签: sql oracle oracle11g

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

在这个问题中,间隔的长度并不固定。

1 个答案:

答案 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)已经存在时,您需要额外的逻辑来忽略值。我不包括这个因为我认为这只会使表达的重要部分复杂化。