JOOQ и TimescaleDB - Как реализовать базовый оператор time_bucket в JOOQ
Я хотел бы реализовать базовую инструкцию time_bucket в JOOQ.
Если я запускаю это заявление в консоли, оно прекрасно работает:
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())
Есть ли простой способ реализовать интервалы?
0 ответов
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])
}