如何将时间戳数据放入 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
我有一个 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