SQL> select LAST_UPDATED_DATE,ODOMETER from demo; LAST_UPDA ODOMETER --------- ---------- 05-OCT-18 47174.77 08-OCT-18 12-OCT-18 50246.37 15-OCT-18 19-OCT-18 53743.11 21-OCT-18 22-OCT-18 25-OCT-18 58789.22 8 rows selected.
我需要确定里程表值的空值,这必须使用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;