Vertica 中的 LOCF(最后的观察结转)?
LOCF (last observation carried forward) in Vertica?
我试图在 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 最方便的方法是什么?
您可以只计算每个点的非'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
。
我会使用:
- 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
我试图在 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 作为 LOCFdate 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 最方便的方法是什么?
您可以只计算每个点的非'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
。
我会使用:
- 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