需要旋转一个矩阵来进行时间序列插值/间隙填充,并希望避免混乱和低效的union all方法。vertica是否提供类似hive的侧视图分解功能?
编辑:@marcothesane——谢谢你有趣的场景——我喜欢你的插值方法。我会多玩玩,看看会怎么样。看起来很有希望。
仅供参考——这是我提出的解决方案——我的场景是,我试图通过查询查看一段时间内的内存使用情况(以及用户/资源池等,基本上是试图获得一个成本指标)。我需要做插值,这样我就可以看到在任何时间点的总使用量。所以这里是我的查询,它按秒对时间序列进行切片,然后按分钟聚合得到“兆字节秒”的度量。
with qry_cte as
(
select
session_id
, request_id
, date_trunc('second',start_timestamp) as dat_str
, timestampadd('ss'
, ceiling(request_duration_ms/1000)::int
, date_trunc('second',start_timestamp)
) as dat_end
, ceiling(request_duration_ms/1000)::int as secs
, memory_acquired_mb
from query_requests
where request_type = 'QUERY'
and request_duration_ms > 0
and memory_acquired_mb > 0
)
select date_trunc('minute',slice_time) as dat_minute
, count(distinct session_id || request_id::varchar) as queries
, sum(memory_acquired_mb) as mb_seconds
from (
select session_id, request_id, slice_time, ts_first_value(memory_acquired_mb) as memory_acquired_mb
from (
select session_id, request_id, dat_str as dat, memory_acquired_mb from qry_cte
union all
select session_id, request_id, dat_end as dat, memory_acquired_mb from qry_cte
) x
timeseries slice_time as '1 second' over (partition by session_id, request_id order by dat)
) x
group by 1 order by 1 desc
;
1条答案
按热度按时间aor9mmx11#
实际上,我手头有一个场景可以满足您的要求:
除此之外:
做这个:
01到06是指从08:00开始记录销售额的一天中的第n个小时。
下面是整个场景,包括初始输入数据。
作为选择的输入数据。。联合所有选择。
一种由6个整数组成的表,用来交叉连接到1的表中。
垂直轴:将输入与6个整数交叉连接,根据索引,在case表达式中只输出第n个sales列。最后,过滤掉同一个case表达式计算结果为null的地方。
使用timeseries子句和线性插值来填补空白:销售数字和索引列。
在最终查询中再次水平透视所有内容。
我可以向你保证,这比表中所有列的联合更有效。
下面是:
玩得开心-
理智的马可