【问题标题】:LOCF (last observation carried forward) in Vertica?Vertica 中的 LOCF(最后的观察结果)?
【发布时间】:2019-03-19 20:57:22
【问题描述】:

我试图在 Vertica 中查找 pandas 风格的函数 LOCF,我找到了 last_value 和 first_value,但我的数据不是他们想要的格式:

date myValue wanted
20171201 NA NA
20180101 10 10
20180102 NA 10
20180103 NA 10
20180105 4  4
20180106 6  6
20180108 NA 6
20180202 7  7

如果数据采用格式,我可以将 first_value/last_value 用于 LOCF

date myValue myPartition 
20171201 NA 0
20180101 10 1
20180102 NA 1
20180103 NA 1
20180105 4  2
20180106 6  3
20180108 NA 3
20180202 7  4

我可以使用它

SELECT date, myValue, 
  LAST_VALUE(myValue) OVER (PARTITION BY myPartition ORDER BY date ASC) AS wanted
FROM myDataAbove

其中一种方法是创建分区以使用 LAST_VALUE 以实现 LOCF 功能。否则,我们可以尝试直接为 Vertica 查找 LOCF 函数。

为 Vertica 实施 LOCF 最方便的方法是什么?

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

    您可以只计算每个点的非'NA' 值的数量:

    select t.*,
           sum(case when myvalue <> 'NA' then 1 else 0 end) over (order by date) as myPartition
    from t;
    

    如果该列确实存储为数字并且'NA'NULL,则您将需要NOT NULL

    【讨论】:

      【解决方案2】:

      我会使用:

      • NULL 而不是 'NA' 字符串
      • 用于 LAST_VALUE 的 ANSI 标准 IGNORE NULLS 指令,并且:
      • Vertica 的 CONDITIONAL_TRUE_EVENT() OLAP 函数用于更改 myvalue...

      像这样:

      WITH input(dt, myvalue,wanted,mypartition) AS (
                SELECT DATE '2017-12-01',NULL::INT,NULL::INT,0 
      UNION ALL SELECT DATE '2018-01-01',10       ,10       ,1 
      UNION ALL SELECT DATE '2018-01-02',NULL::INT,10       ,1 
      UNION ALL SELECT DATE '2018-01-03',NULL::INT,10       ,1 
      UNION ALL SELECT DATE '2018-01-05',4        ,4        ,2 
      UNION ALL SELECT DATE '2018-01-06',6        ,6        ,3 
      UNION ALL SELECT DATE '2018-01-08',NULL::INT,6        ,3 
      UNION ALL SELECT DATE '2018-02-02',7        ,7        ,4 
      )
      SELECT
        dt
      , myvalue
      , LAST_VALUE(myvalue IGNORE NULLS) OVER(ORDER BY dt) AS val_gen
      , wanted
      , CONDITIONAL_TRUE_EVENT(myvalue IS NOT NULL) OVER(ORDER BY dt) AS part_gen
      , mypartition
      FROM input;
      
      Output:
      dt        |myvalue|val_gen|wanted|part_gen|mypartition
      2017-12-01|(null) |(null) |(null)|       0|          0
      2018-01-01|     10|     10|    10|       1|          1
      2018-01-02|(null) |     10|    10|       1|          1
      2018-01-03|(null) |     10|    10|       1|          1
      2018-01-05|      4|      4|     4|       2|          2
      2018-01-06|      6|      6|     6|       3|          3
      2018-01-08|(null) |      6|     6|       3|          3
      2018-02-02|      7|      7|     7|       4|          4
      

      【讨论】:

        猜你喜欢
        • 2020-06-14
        • 2018-04-23
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多