time_bucket 函数类似于标准的 PostgreSQL date_bin 函数。与 date_bin 不同,它允许任意月份或更长时间的时间间隔。返回值是桶的开始时间。

请注意,夏令时边界意味着在此类转换后聚合到桶中的数据量可能不规则。例如,如果 bucket_width 为 2 小时,则在夏令时边界上按当地时间分桶的 UTC 小时数可以是三小时或一小时。

名称类型描述
bucket_widthINTERVALPostgreSQL 时间间隔,表示每个桶的持续时间
tsDATE、TIMESTAMP 或 TIMESTAMPTZ要分桶的时间戳

如果使用月份作为 bucket_width 的间隔,则不能将其与非月份组件组合使用。例如,1 month3 months 都是有效的桶宽度,但 1 month 1 day3 months 2 weeks 无效。

名称类型描述
timezoneTEXT用于计算桶开始和结束时区。只能与 TIMESTAMPTZ 一起使用。默认为 UTC。
originDATE、TIMESTAMP 或 TIMESTAMPTZ桶相对于此时间戳对齐。对于不包含月份或年份间隔的桶,默认为 2000 年 1 月 3 日午夜,对于月份、年份和世纪桶,默认为 2000 年 1 月 1 日午夜。
offsetINTERVAL偏移所有时间桶的时间间隔。正值会将桶的开始和结束时间向后移动。负值会将桶的开始和结束时间向前移动。当 offset 用作命名参数时,必须用双引号括起来,因为它是 PostgreSQL 中的保留关键字。
名称类型描述
bucket_widthINTEGER桶宽度
tsINTEGER要分桶的时间戳
名称类型描述
offsetINTEGER偏移所有桶的量。正值会将桶的开始和结束时间向后移动。负值会将桶的开始和结束时间向前移动。当 offset 用作命名参数时,必须用双引号括起来,因为它是 PostgreSQL 中的保留关键字。

简单的五分钟平均

SELECT time_bucket('5 minutes', time) AS five_min, avg(cpu)
FROM metrics
GROUP BY five_min
ORDER BY five_min DESC LIMIT 10;

要报告桶的中间,而不是左边缘

SELECT time_bucket('5 minutes', time) + '2.5 minutes'
AS five_min, avg(cpu)
FROM metrics
GROUP BY five_min
ORDER BY five_min DESC LIMIT 10;

对于舍入,移动对齐方式,使桶的中间位于五分钟标记处,并报告桶的中间

SELECT time_bucket('5 minutes', time, '-2.5 minutes'::INTERVAL) + '2.5 minutes'
AS five_min, avg(cpu)
FROM metrics
GROUP BY five_min
ORDER BY five_min DESC LIMIT 10;

在此示例中,添加显式转换以确保 PostgreSQL 选择正确的函数。

要移动桶的对齐方式,可以使用作为时间戳、timestamptz 或日期类型传递的 origin 参数。此示例将每周的开始时间移动到星期日,而不是默认的星期一

SELECT time_bucket('1 week', timetz, TIMESTAMPTZ '2017-12-31')
AS one_week, avg(cpu)
FROM metrics
GROUP BY one_week
WHERE time > TIMESTAMPTZ '2017-12-01' AND time < TIMESTAMPTZ '2018-01-03'
ORDER BY one_week DESC LIMIT 10;

在此示例中,origin 参数的值为 2017-12-31,这是分析期间的星期日。但是,提供给函数的 origin 可以位于被分析数据之前、期间或之后。所有桶都相对于此 origin 计算。因此,在此示例中,可以使用任何星期日。请注意,由于本示例中使用了 time < TIMESTAMPTZ '2018-01-03',因此最后一个桶将只有 4 天的数据。此转换为 TIMESTAMP 会根据服务器的时区设置将时间转换为当地时间。

SELECT time_bucket(INTERVAL '2 hours', timetz::TIMESTAMP)
AS five_min, avg(cpu)
FROM metrics
GROUP BY five_min
ORDER BY five_min DESC LIMIT 10;

对温度值进行分桶以计算月平均温度。将时区设置为 'Europe/Berlin',以便桶的开始和结束时间与柏林午夜对齐。

SELECT time_bucket('1 month', ts, 'Europe/Berlin') AS month_bucket,
avg(temperature) AS avg_temp
FROM weather
GROUP BY month_bucket
ORDER BY month_bucket DESC LIMIT 10;

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面