JOOQ 和 TimescaleDB - 如何在 JOOQ 中实现基本的 time_bucket 语句
Posted
技术标签:
【中文标题】JOOQ 和 TimescaleDB - 如何在 JOOQ 中实现基本的 time_bucket 语句【英文标题】:JOOQ and TimescaleDB - How to implement a basic time_bucket statement in JOOQ 【发布时间】:2019-04-17 14:19:24 【问题描述】:我想在 JOOQ 中实现一个基本的 time_bucket 语句。
如果我在控制台中运行此语句,它会非常好:
SELECT time_bucket('5 minutes', time) as t, avg(average)
from TABLE
GROUP BY t
如果我尝试使用 JOOQ 实现它,我会遇到生成的例程不起作用的问题,因为我无法添加间隔。
我想要类似下面的代码,但间隔“5 分钟”不起作用:
dslContext.select(timeBucket('5 minutes', TABLE.TIME), avg(TABLE.AVERAGE))
.from(TABLE)
.groupBy(timeBucket8('5 minutes', TABLE.TIME))
.fetch())
有没有简单的方法来实现间隔?
【问题讨论】:
究竟是什么不起作用?我假设你写了一些plain SQL templating functions,比如timeBucket()
。那里的实现是什么?
【参考方案1】:
SQL:
create table mytable (moment timestamp with timezone, ...)
select create_hypertable('mytable', 'moment', chunk_time_interval => INTERVAL '5 minute');
用 jooq 选择:
import org.jooq.types.YearToSecond
import java.time.Duration
import org.jooq.impl.DSL.count
import org.jooq.impl.DSL.field
// custom function to combine arguments Duration and OffsetDateTime for TimeBucket2
private fun timeBucket(d: Duration, field: Field<OffsetDateTime>): Field<OffsetDateTime>
val f = TimeBucket2()
f.setBucketWidth(YearToSecond.valueOf(d))
f.setTs(field)
return f.asField()
// field name alias
val BUCKET = field("bucket", OffsetDateTime::class.java)
val COUNT = field("count", Int::class.java)
val ctx = DSL.using(conn, SQLDialect.POSTGRES, settings)
val recs = ctx.select(
timeBucket(Duration.ofMinutes(5), MYTABLE.MOMENT).`as`(BUCKET),
count().`as`(COUNT)
).from(MYTABLE)
.groupBy(BUCKET)
.fetch()
for (rec in recs)
println(rec[BUCKET] + " => " + rec[COUNT])
【讨论】:
以上是关于JOOQ 和 TimescaleDB - 如何在 JOOQ 中实现基本的 time_bucket 语句的主要内容,如果未能解决你的问题,请参考以下文章
Grafana - 我们如何加入来自 TimescaleDB 和 ElasticSearch 的数据?
如何使用 JPQL、Spring Data Repositories 和 Hibernate 为 TimescaleDB `time_bucket` 函数参数化 Postgresql 间隔
问题:如何在具有卷的ARM体系结构上在Docker上运行TimeScaleDB?
快速入门:Java 连接使用 时序数据库 TimescaleDB