SQL>从演示中选择LAST_UPDATED_DATE,ODOMETER;

LAST_UPDA ODOMETER
--------- ----------
05-OCT-18 47174.77
08-OCT-18
18-OCT-18 50246.37
15-OCT-18
19-OCT-18 53743.11
18-OCT-18
18-OCT-18
25-OCT-18 58789.22

已选择8行。



我需要确定里程表的值是否为空,而这必须使用SQL来完成。我当时想做的是-


获取里程表的前一个和下一个非空值以及两天之间的差额,我可以使用这些天数来计算每天的平均旅行距离。


例如在这种情况下(50246.37-47174.77)/(12-OCT-18-05-OCT-18)=〜439


现在,使用每天的平均值,计算天数之间的差异,然后将其乘以平均值。


例如,(08-OCT-18-05-OCT-18)= 3天,并连续3天439 * 3 =1317。因此,08-Oct-18的值可以是47174.77 + 1317 = 48491.77

现在,我需要为此编写SQL代码的帮助。

任何帮助将不胜感激。

最佳答案

您可以使用累积的最大值和最小值来获取上一行和下一行(这假设里程表仅沿一个方向运行)。其余只是算术插值的算术运算:

select d.last_updated_date, d.odometer,
       (case when d.odometer is not null then d.odometer
             else prev_o + (next_o - prev_o) * (last_updated_date - prev_lud) / (next_lud - prev_lud)
        end)
from (select d.*,
             max(case when odometer is not null then last_updated_date end) over (order by last_updated_date) as prev_lud,
             max(odometer) over (order by last_updated_date) as prev_o,
             min(case when odometer is not null then last_updated_date end) over (order by last_updated_date desc) as next_lud,
             min(odometer) over (order by last_updated_date desc) as next_o
      from demo d
     ) d;

09-29 19:44