【问题标题】:How to undertake linear interpolation of null values in a SQL table?如何对 SQL 表中的空值进行线性插值?
【发布时间】:2022-01-16 15:50:29
【问题描述】:

我在 Databricks 中有一个缺失值 (null) 的 Spark SQL 表,其格式如下:

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 列可能会报告错误和缺失值。有时这些缺失值出现在日期范围的开始/结束处。

如果项目具有前后期间的值,我想使用前后记录值的简单平均值来插入空值。当缺失值位于日期范围的开头或结尾时,我想为该item_code 填充第一个或最后一个可用的stock 值。我的目标表是这样的:

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

我想我可以使用窗口函数来查找前后期间的平均值,但我不确定如何构建窗口。任何建议将不胜感激。

【问题讨论】:

    标签: sql apache-spark apache-spark-sql linear-interpolation


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 2012-02-08
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      相关资源
      最近更新 更多