首页 > 解决方案 > Presto 中的结转值

问题描述

我正在使用以下查询来透视我的数据并生成 CSV,但问题是我有一个数据集,其中数据点以分散的方式与每个时间戳一起出现。

with map_date as (
 SELECT 
 vin, 
 epoch,
 timestamp,
 date,
 map_agg(signalName, value) as map_values
 from hive.vehicle_signals.vehicle_signals_flat
where date(date) = date('2020-03-12')
and date(cast(from_unixtime(epoch) as timestamp) - interval '0' hour) = current_date - interval '2' day
and vin = '000011' 
and signalName in ('timestamp','epoch','msgId','usec','vlan','vin','msgName','value')
GROUP BY vin, epoch, timestamp, date
order by timestamp desc 
)
SELECT
  epoch
, timestamp
, CASE WHEN element_at(map_values, 'value') IS NOT NULL THEN map_values['value'] ELSE NULL END AS value
, vin
, current_date - interval '2' day AS date
from map_date

结果,我得到了以下 CSV。有没有办法可以结转该值,直到在较新的时间戳找到新值?如下图所示,值“14.3”出现,下一个值“16.5”出现在几个时间戳之后,我如何将值“14.3”带到第 7 行并在整个列上重复逻辑。如何使用 Presto 使我的输出字段看起来像图像中的“G”列?

在此处输入图像描述

提前致谢!!

标签: window-functionspresto

解决方案


您可以使用 mysql @variable 来存储最后一个值,例如:

SELECT
  epoch
, timestamp
, CASE WHEN element_at(map_values, 'value') IS NOT NULL THEN @last_value:= map_values['value'] ELSE @last_value END AS value
, vin
, current_date - interval '2' day AS date
from map_date, (select @last_value:=0) v

最后一部分,(select @last_value:=0) v是初始化@last_value变量。

一个基础教程

https://www.mysqltutorial.org/mysql-variables/

带有附加信息的更高级教程

https://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/


推荐阅读