time_bucket
函数类似于标准的 PostgreSQL date_bin
函数。与 date_bin
不同,它允许任意月份或更长时间的时间间隔。返回值是桶的开始时间。
请注意,夏令时边界意味着在此类转换后聚合到桶中的数据量可能不规则。例如,如果 bucket_width
为 2 小时,则在夏令时边界上按当地时间分桶的 UTC 小时数可以是三小时或一小时。
名称 | 类型 | 描述 |
---|---|---|
bucket_width | INTERVAL | PostgreSQL 时间间隔,表示每个桶的持续时间 |
ts | DATE、TIMESTAMP 或 TIMESTAMPTZ | 要分桶的时间戳 |
如果使用月份作为 bucket_width
的间隔,则不能将其与非月份组件组合使用。例如,1 month
和 3 months
都是有效的桶宽度,但 1 month 1 day
和 3 months 2 weeks
无效。
名称 | 类型 | 描述 |
---|---|---|
timezone | TEXT | 用于计算桶开始和结束时区。只能与 TIMESTAMPTZ 一起使用。默认为 UTC。 |
origin | DATE、TIMESTAMP 或 TIMESTAMPTZ | 桶相对于此时间戳对齐。对于不包含月份或年份间隔的桶,默认为 2000 年 1 月 3 日午夜,对于月份、年份和世纪桶,默认为 2000 年 1 月 1 日午夜。 |
offset | INTERVAL | 偏移所有时间桶的时间间隔。正值会将桶的开始和结束时间向后移动。负值会将桶的开始和结束时间向前移动。当 offset 用作命名参数时,必须用双引号括起来,因为它是 PostgreSQL 中的保留关键字。 |
名称 | 类型 | 描述 |
---|---|---|
bucket_width | INTEGER | 桶宽度 |
ts | INTEGER | 要分桶的时间戳 |
名称 | 类型 | 描述 |
---|---|---|
offset | INTEGER | 偏移所有桶的量。正值会将桶的开始和结束时间向后移动。负值会将桶的开始和结束时间向前移动。当 offset 用作命名参数时,必须用双引号括起来,因为它是 PostgreSQL 中的保留关键字。 |
简单的五分钟平均
SELECT time_bucket('5 minutes', time) AS five_min, avg(cpu)FROM metricsGROUP BY five_minORDER BY five_min DESC LIMIT 10;
要报告桶的中间,而不是左边缘
SELECT time_bucket('5 minutes', time) + '2.5 minutes'AS five_min, avg(cpu)FROM metricsGROUP BY five_minORDER 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 metricsGROUP BY five_minORDER 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 metricsGROUP BY one_weekWHERE 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 metricsGROUP BY five_minORDER BY five_min DESC LIMIT 10;
对温度值进行分桶以计算月平均温度。将时区设置为 'Europe/Berlin',以便桶的开始和结束时间与柏林午夜对齐。
SELECT time_bucket('1 month', ts, 'Europe/Berlin') AS month_bucket,avg(temperature) AS avg_tempFROM weatherGROUP BY month_bucketORDER BY month_bucket DESC LIMIT 10;
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面。