Sql Vertica的LOCF(上次观察结转)?

Sql Vertica的LOCF(上次观察结转)?,sql,vertica,Sql,Vertica,我试图在Vertica中找到pandas风格的函数LOCF,我想找到last_值和first_值,但我的数据不是他们想要的格式: 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 如果数据的格式为 date myValue myPartition 20171201 NA 0

我试图在Vertica中找到pandas风格的函数LOCF,我想找到last_值和first_值,但我的数据不是他们想要的格式:

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
如果数据的格式为

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_值来实现LOCF函数。否则,我们可以尝试直接为Vertica找到LOCF函数


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

您只需计算每个点的非“NA”值的数量:

select t.*,
       sum(case when myvalue <> 'NA' then 1 else 0 end) over (order by date) as myPartition
from t;
选择t.*,
作为myPartition(按日期排序)求和(当myvalue“NA”然后1或0结束时的情况)
从t;
如果列确实存储为数字,并且
'NA'
NULL
,则需要
非NULL

我会使用:

  • NULL而不是“NA”字符串
  • ANSI标准忽略最后一个_值的NULLS指令,以及:
  • Vertica的条件_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