首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在vertica db (vsql)中聚合时间戳范围内的行

如何在vertica db (vsql)中聚合时间戳范围内的行
EN

Stack Overflow用户
提问于 2021-08-27 17:41:16
回答 2查看 47关注 0票数 0

假设我有一个包含如下数据的表:

代码语言:javascript
复制
         ts          | bandwidth_bytes
---------------------+-----------------
 2021-08-27 22:00:00 |    3792
 2021-08-27 21:45:00 |    1164
 2021-08-27 21:30:00 |    7062
 2021-08-27 21:15:00 |    3637
 2021-08-27 21:00:00 |    2472
 2021-08-27 20:45:00 |    1328
 2021-08-27 20:30:00 |    1932
 2021-08-27 20:15:00 |    1434
 2021-08-27 20:00:00 |    1530
 2021-08-27 19:45:00 |    1457
 2021-08-27 19:30:00 |    1948
 2021-08-27 19:15:00 |    1160

我需要输出如下内容:

代码语言:javascript
复制
         ts          | bandwidth_bytes
---------------------+-----------------
 2021-08-27 22:00:00 |    15,655
 2021-08-27 21:00:00 |    7166
 2021-08-27 20:00:00 |    6095

我想做一个小时的数据和bandwidth_bytes的时间戳。我特别想在vsql中实现这一点。

还有更多的列,但为了简化起见,我只显示了这两个。

EN

回答 2

Stack Overflow用户

发布于 2021-08-27 18:16:36

您可以使用date_trunc()

代码语言:javascript
复制
select [date_trunc('hour', ts)][1] as ts_hh, sum(bandwidth_bytes)
from t
group by ts_hh;
票数 1
EN

Stack Overflow用户

发布于 2021-08-28 14:23:26

使用Vertica可爱的函数TIME_SLICE()

你不能只按小时计算,你也可以按2或3个小时计算,这是DATE_TRUNC()所不提供的。

您似乎希望20:00:0121:00:00之间的所有内容都属于21:00:00的一个时间片。然而,在DATE_TRUNC()TIME_SLICE()中,属于同一时间片的是20:00:00 to 20:59:59。因此,在应用TIME_SLICE()之前,我减去了一秒钟。

代码语言:javascript
复制
WITH
-- your in data ...
indata(ts,bandwidth_bytes) AS (
          SELECT TIMESTAMP '2021-08-27 22:00:00',3792
UNION ALL SELECT TIMESTAMP '2021-08-27 21:45:00',1164
UNION ALL SELECT TIMESTAMP '2021-08-27 21:30:00',7062
UNION ALL SELECT TIMESTAMP '2021-08-27 21:15:00',3637
UNION ALL SELECT TIMESTAMP '2021-08-27 21:00:00',2472
UNION ALL SELECT TIMESTAMP '2021-08-27 20:45:00',1328
UNION ALL SELECT TIMESTAMP '2021-08-27 20:30:00',1932
UNION ALL SELECT TIMESTAMP '2021-08-27 20:15:00',1434
UNION ALL SELECT TIMESTAMP '2021-08-27 20:00:00',1530
UNION ALL SELECT TIMESTAMP '2021-08-27 19:45:00',1457
UNION ALL SELECT TIMESTAMP '2021-08-27 19:30:00',1948
UNION ALL SELECT TIMESTAMP '2021-08-27 19:15:00',1160
)
SELECT
  TIME_SLICE(ts - INTERVAL '1 SECOND' ,1,'HOUR','END') AS ts
, SUM(bandwidth_bytes)    AS bandwidth_bytes
FROM indata
GROUP BY 1
ORDER BY 1 DESC;
         ts          | bandwidth_bytes 
---------------------+-----------------
 2021-08-27 22:00:00 |           15655
 2021-08-27 21:00:00 |            7166
 2021-08-27 20:00:00 |            6095
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68957473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档