gpt4 book ai didi

在值之间插入的 SQL 查询

转载 作者:行者123 更新时间:2023-12-05 08:52:37 24 4
gpt4 key购买 nike

我打算在列中的值之间进行插值(线性插值),然后使用 SQL 查询将其插入到新列中。根据我的在线搜索,我怀疑 LEAD 分析功能可能有用。我不熟悉编写 SQL 查询。因此,关于如何实现它的任何见解都将非常有帮助。

样本数据集描述如下:

Emp  Test_date  Value
--- --------- -----
A 1/1/2001 null
A 1/2/2001 100
A 1/3/2001 null
A 1/4/2001 80
A 1/5/2001 null
A 1/6/2001 null
A 1/7/2001 75

我们的想法是获得第四列,其值为:

null
100
interpolatedValue1
80
interpolatedValue2
interpolatedValue3
75

Interpolatedvalue1 将是 10080 之间的插值,

Interpolatedvalue2 将是 8075 之间的线性插值。

InterpolatedValue3 将是 Interpolatedvalue275

之间的线性插值

简单线性插值的工作原理如下:

给定两个点(V1D1),(V3D3)。 D2V2 值是多少?

(V3-V1)/(D3-D1) * (D2-D1) + V1

最佳答案

我相信这可能会得到一些简化,但会得到您想要的答案。稍微棘手的一点是获取非空值之间的天数(即您要填充的间隙的大小)以及该间隙内的位置:

-- CTE for sample data
with your_table (emp, test_date, value) as (
select 'A', date '2001-01-01', null from dual
union all select 'A', date '2001-01-02', 100 from dual
union all select 'A', date '2001-01-03', null from dual
union all select 'A', date '2001-01-04', 80 from dual
union all select 'A', date '2001-01-05', null from dual
union all select 'A', date '2001-01-06', null from dual
union all select 'A', date '2001-01-07', 75 from dual
)
-- actual query
select emp, test_date, value,
coalesce(value,
(next_value - prev_value) -- v3-v1
/ (count(*) over (partition by grp) + 1) -- d3-d1
* row_number() over (partition by grp order by test_date desc) -- d2-d1, indirectly
+ prev_value -- v1
) as interpolated
from (
select emp, test_date, value,
last_value(value ignore nulls)
over (partition by emp order by test_date) as prev_value,
first_value(value ignore nulls)
over (partition by emp order by test_date range between current row and unbounded following) as next_value,
row_number() over (partition by emp order by test_date) -
row_number() over (partition by emp order by case when value is null then 1 else 0 end, test_date) as grp
from your_table
)
order by test_date;
E TEST_DATE       VALUE INTERPOLATED
- ---------- ---------- ------------
A 2001-01-01
A 2001-01-02 100 100
A 2001-01-03 90
A 2001-01-04 80 80
A 2001-01-05 76.6666667
A 2001-01-06 78.3333333
A 2001-01-07 75 75

我使用了 last_valuefirst_value 而不是 leadlag,但两者都有效。 (我想在大型数据集上超前/滞后可能更快)。 grp 计算为 Tabibitosan .

关于在值之间插入的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56046612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com