我对Vertica中的TIMESERIES子句有疑问。假设我有以下查询:
SELECT ts
FROM
(
SELECT '2011-10-01'::TIMESTAMP as tm
UNION
SELECT '2018-12-31'::TIMESTAMP as tm
) as t
TIMESERIES ts as '1 MONTH' OVER (ORDER BY tm)
这给了我以下结果:
2011-09-30 00:00:00
2011-10-30 00:00:00
2011-11-29 00:00:00
2011-12-29 00:00:00
...
然后,如果我把2012-10-01作为开始日期,我最终会得到以下结果:
2012-09-24 00:00:00
2012-10-24 00:00:00
2012-11-23 00:00:00
2012-12-23 00:00:00
...
如您所见,第一个结果集从9月30日开始,第二个结果集从9月24日开始。现在我从九月开始就没有问题。然而,我确实有一个问题,从一个看似完全随机的日子开始,这取决于我决定开始我的间隔的日期。当间隔决定在30日开始或更差时,这会导致问题。基本上,我想要的是让我的间隔从我指定的任何日期开始,如下:
2012-10-01 00:00:00
2012-10-31 00:00:00
...
如果不进行一些可笑的复杂计算,这样的事情是否可能?
答案 0 :(得分:2)
然后,如果我把2012-10-01作为开始日期,我最终会得到以下结果
请注意,两个时间序列(从2012-10-01和2011-10-01开始)都会生成相同的日期。 TIMESERIES的要点是在点之间提供一致的间隔,这对格里高利月来说是不可能的。
虽然这让我想知道为什么时间序列会因插入一些被直接给出的东西而烦恼。
TIMESERIES不关心使用您提供的开始/停止边界。当你期望以不同的间隔(实际月份)跳跃时,这尤其不可行。
正如我在上一期提出的问题中所指出的,' 1个月'真的是30天,这导致了这样的问题:
2017-01-31 00:00:00
2017-03-02 00:00:00
哪里不能成为二月份的参赛作品。
答案 1 :(得分:1)
来自文档:
'length_and_time_unit_expression'
Is INTERVAL (DAY TO SECOND) that represents the length of time unit of time
slice computation; for example, TIMESERIES slice_time AS '3 seconds' ...
所以不支持INTERVAL (YEAR TO MONTH)
,这可能就是为什么你会看到时髦的空白(我的赌注是在日期的unix纪元值上有某种模数转换,使开始日期回到过去) 。
你可以做一些脏事,比如白天滥用时间序列来生成一个你添加回原始日期的序列。 Cleaner将创建某种日期维度表。也许有人比这更聪明。
select add_months('2012-10-01'::timestamp,timestampdiff('dd',to_timestamp(0),ts))
from (
select to_timestamp(0) as tm
union all
select to_timestamp(0) + timestampdiff('mm','2012-10-01'::timestamp,'2018-12-31'::timestamp)
) as t
timeseries ts as interval '1 DAY' over (order by tm)