如何对SQLtable中的空值进行线性插值?
How to undertake linear interpolation of null values in a SQL table?
我在 Databricks 中有一个 Spark SQL table,它具有以下形式的缺失值(null):
date price stock item_code
2020-01-01 17.99 6 01
2020-01-02 17.99 null 01
2020-01-03 17.99 4 01
2020-01-04 17.99 null 01
2020-01-01 11.59 null 02
2020-01-02 11.59 8 02
2020-01-03 11.59 null 02
2020-01-04 11.59 4 02
对于每个 item_code
,我有相同范围 date
的数据。 stock
列可能会出现报告错误和缺失值。有时,这些缺失值出现在日期范围的 start/end。
如果某个项目具有前后期间的值,我想使用前后记录值的简单平均值来插入空值。当缺失值位于日期范围的开始或结束时,我想为该 item_code
填充第一个或最后一个可用的 stock
值。我的objectivetable是这样的:
date price stock item_code
2020-01-01 17.99 6 01
2020-01-02 17.99 5 01
2020-01-03 17.99 4 01
2020-01-04 17.99 4 01
2020-01-01 11.59 8 02
2020-01-02 11.59 8 02
2020-01-03 11.59 6 02
2020-01-04 11.59 4 02
我想我可以使用 window 函数来计算 before/after 周期的平均值,但我不确定如何构建 window。如有任何建议,我们将不胜感激。
ANALYTICAL FUNCTION
应该可以解决这个问题:
SELECT
date,
price,
CASE
WHEN stock Is NULL then AVG(stock) OVER( PARTITION BY item_code ORDER BY item_code, date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
ELSE stock
END AS stock,
item_code
FROM t
ORDER BY item_code, date
见DEMO
我在 Databricks 中有一个 Spark SQL table,它具有以下形式的缺失值(null):
date price stock item_code
2020-01-01 17.99 6 01
2020-01-02 17.99 null 01
2020-01-03 17.99 4 01
2020-01-04 17.99 null 01
2020-01-01 11.59 null 02
2020-01-02 11.59 8 02
2020-01-03 11.59 null 02
2020-01-04 11.59 4 02
对于每个 item_code
,我有相同范围 date
的数据。 stock
列可能会出现报告错误和缺失值。有时,这些缺失值出现在日期范围的 start/end。
如果某个项目具有前后期间的值,我想使用前后记录值的简单平均值来插入空值。当缺失值位于日期范围的开始或结束时,我想为该 item_code
填充第一个或最后一个可用的 stock
值。我的objectivetable是这样的:
date price stock item_code
2020-01-01 17.99 6 01
2020-01-02 17.99 5 01
2020-01-03 17.99 4 01
2020-01-04 17.99 4 01
2020-01-01 11.59 8 02
2020-01-02 11.59 8 02
2020-01-03 11.59 6 02
2020-01-04 11.59 4 02
我想我可以使用 window 函数来计算 before/after 周期的平均值,但我不确定如何构建 window。如有任何建议,我们将不胜感激。
ANALYTICAL FUNCTION
应该可以解决这个问题:
SELECT
date,
price,
CASE
WHEN stock Is NULL then AVG(stock) OVER( PARTITION BY item_code ORDER BY item_code, date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
ELSE stock
END AS stock,
item_code
FROM t
ORDER BY item_code, date
见DEMO