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;