gpt4 book ai didi

java - JOOQ 和 TimescaleDB - 如何在 JOOQ 中实现基本的 time_bucket 语句

转载 作者:行者123 更新时间:2023-12-01 13:46:22 30 4
gpt4 key购买 nike

我想在 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())

有没有一种简单的方法来实现间隔?

最佳答案

查询语句:

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])
}

关于java - JOOQ 和 TimescaleDB - 如何在 JOOQ 中实现基本的 time_bucket 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53303207/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com