首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LOCF (最后一次观察)在Vertica?

LOCF (最后一次观察)在Vertica?
EN

Stack Overflow用户
提问于 2018-10-15 12:16:08
回答 2查看 133关注 0票数 0

我试图在Vertica中找到熊猫风格的函数LOCF,我可以找到last_value和first_value,但是我的数据并不是它们想要的格式:

代码语言:javascript
复制
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

如果数据是格式的,可以使用LOCF的第一个_value/last_value

代码语言:javascript
复制
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

我可以用它

代码语言:javascript
复制
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最方便的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-15 14:45:51

您只需计算到每一点的非'NA'值的数量:

代码语言:javascript
复制
select t.*,
       sum(case when myvalue <> 'NA' then 1 else 0 end) over (order by date) as myPartition
from t;

如果列实际上是作为一个数字存储的,并且'NA'NULL,则需要使用NOT NULL

票数 1
EN

Stack Overflow用户

发布于 2018-10-27 14:57:28

我会用:

  • 空,而不是'NA‘字符串。
  • ANSI标准忽略了LAST_VALUE的NULLS指令,并且:
  • Vertica的CONDITIONAL_TRUE_EVENT() OLAP函数用于myvalue的变化.

就像这样:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52816595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档