如何将时间戳数据放入 vertica 中自定义宽度为 n 小时的桶中

How to bin timestamp data into buckets of custom width of n hours in vertica

我有一个 table,其中包含一列 Start_Timestamp,该列的时间戳值类似于 2020-06-02 21:08:37。我想创建新列,将这些时间戳分类为 6 小时的箱子。

例如

输入:

Start_Timestamp
2020-06-02 21:08:37
2020-07-19 01:23:40
2021-11-13 12:08:37

预期输出(这里每个 bin 的宽度为 6 小时):

Start_Timestamp Bin
2020-06-02 21:08:37 18H - 24H
2020-07-19 01:23:40 00H - 06H
2021-11-13 12:08:37 12H - 18H

我试过使用 TIMESERIES,但任何人都可以帮助生成以下格式的输出

您可以简单地提取小时并进行一些运算:

select t.*,
       floor(extract(hour from start_timestamp) / 6) * 6 as bin
from t;

注意:这通过最早的时间来表征 bin。这似乎比字符串表示更有用,但如果您确实需要,也可以构造字符串。

这是 Vertica。使用 TIME_SLICE() 函数。然后,将它与 Vertica 与 Oracle 共享的 TO_CHAR() 函数结合起来。

您总是可以添加一个 CASE WHEN 表达式来将 00:00 更改为 24:00,但由于这不是标准,我什至不会费心。

WITH
indata(start_ts) AS (
          SELECT TIMESTAMP '2020-06-02 21:08:37'
UNION ALL SELECT TIMESTAMP '2020-07-19 01:23:40'
UNION ALL SELECT TIMESTAMP '2021-11-13 12:08:37'
)
SELECT 
  TIME_SLICE(start_ts,6,'HOUR') 
  AS tm_slice
,   TO_CHAR(TIME_SLICE(start_ts,6,'HOUR'),'HH24:MIH - ')
  ||TO_CHAR(TIME_SLICE(start_ts,6,'HOUR','END'),'HH24:MIH') 
  AS caption
, start_ts
FROM indata;
-- out       tm_slice       |     caption     |      start_ts       
-- out ---------------------+-----------------+---------------------
-- out  2020-06-02 18:00:00 | 18:00H - 00:00H | 2020-06-02 21:08:37
-- out  2020-07-19 00:00:00 | 00:00H - 06:00H | 2020-07-19 01:23:40
-- out  2021-11-13 12:00:00 | 12:00H - 18:00H | 2021-11-13 12:08:37