SQL 也能搞复杂时序查询?使用 SQL 在 GreptimeDB 上做 Range 查询
查询并聚合一个「给定长度的时间范围的数据」,是时序数据中常见的一种查询模式。例如 PromQL
中的 Range selector
,就原生地支持了这种时序查询。但对于通用的数据库查询语言 SQL ,这类时序查询很难通过原生的 SQL 完成,所以我们在 GreptimeDB 中引入了扩展的 SQL Range
查询语法,将时序查询能力与 SQL 高度灵活的表达能力相结合,实现了 SQL 对时序数据查询的原生支持。
✨ 让数据动起来! 使用 SQL 在 GreptimeDB 上实现动态 Range 查询 https://greptime.cn/playground
🔧 点击链接加入我们的 Playground,立即体验👆
示例
我们用一个例子来介绍 Range 查询。下面这张表 temperature
记录了不同城市在不同时间的气温:
我们想查询北京从 2023 年 5 月 2 日(时间戳为 1682985600000
)以前的:
- 每日的日平均气温;
- 每日的周平均气温;
- 如果某天的数据点缺失,则以前后两天平均气温均值作为这天的平均气温。
我们首先从 PromQL
的视角来看如何去写这句查询,对于两条查询,都需要以天为步长进行查询。对于日平均气温,需要向前聚合一天的数据,对于周平均气温,需要每次向前聚合一周的数据,并求出平均值。另外我们需要使用 @
将查询时间对齐到时间戳 1682985600000
。
最后的查询为:
-- 日平均气温 avg_over_time(temperature{city="beijing"}[1d] @ 1682985600000) step=1d -- 周平均气温 avg_over_time(temperature{city="beijing"}[7d] @ 1682985600000) step=1d
但上面的查询存在一些问题。PromQL
强调的是做数据的查询,但不能很好地处理查询中缺失数据点的情况,也就是如何对查询的数据作平滑。PromQL
只是存在 Lookback delta 的机制(具体见:https://promlabs.com/blog/2020/07/02/selecting-data-in-promql/#lookback-delta),用一些旧的数据来代替缺失的数据点。这样的默认行为在某些情况下并不是用户想要的。因为 Lookback delta 的机制的存在,会导致聚合的数据携带一些旧值。在默认情况下,PromQL
很难做到数据精确性的控制。并且针对我们上面提出的数据平滑要求,PromQL
也没有很好的办法完成。
如果从传统的 SQL 出发,因为 SQL 中不存在 Lookback delta 的机制,我们可以精确地控制我们数据选择和聚合的范围。所见即所得,进行比较精确的查询。
上述查询本质上是以天为单位,对每天和每周的数据做聚合。针对日平均气温,我们可以利用 date_trunc
这一 scalar 函数,该函数能够将时间截断到某一个精度上,我们使用这个函数将时间截断到天这一单位,最后再以天为单位对数据进行聚合,就能得到我们想要的结果:
-- 日平均气温 SELECT day, avg(temp), FROM ( SELECT date_trunc('day', ts) as day temp, FROM temperature WHERE city="beijing" and ts < 1682985600000 ) GROUP BY day;
这样也基本满足了我们的需求,但是这种查询问题在于:
- 写起来非常繁琐,需要写子查询;
- 应用范围有限,用这种办法只能求出日平均气温,没法求出周平均气温。因为 SQL 中的聚合要求每一条数据只能属于一个 group。但是在时序查询中,如果每次采样的时间是一星期,步长是一天的话,一条数据必然会被多个 group 使用,针对这种查询传统 SQL 无能为力;
- 还是没办法解决空白数据填充的问题。
在上面讨论之后,我们需要思考:这种查询本质上是时序查询,但是我们所使用的 SQL——虽然有非常灵活的表达能力,但却不是专门为时序数据库设计的。我们需要一些新的 SQL 扩展语法,在 SQL 中来简单的描述这种时序查询。一些时序数据库如 InfluxDB 提供了 group by time
语法, QuestDB 提供了 Sample By
语法,这些实现为我们的 Range 查询提供了思路。下面介绍如何使用 GreptimeDB 提供的 Range 语法来进行上述查询。
-- 日平均气温 SELECT ts, avg(temp) RANGE '1d' FILL LINEAR, FROM temperature WHERE city="beijing" and ts < 1682985600000 ALIGN '1d'; -- 周平均气温 SELECT ts, avg(temp) RANGE '7d' FILL LINEAR, FROM temperature WHERE city="beijing" and ts < 1682985600000 ALIGN '1d';
我们为一个 SELECT
语句引入了一个关键字 ALIGN
,代表每次时序查询的步长,ALIGN
会将时间对齐到日历上。在聚合函数后引入了一个 RANGE
关键词,代表在每次数据聚合的范围,FILL LINEAR 表示数据点为空的时候的数据填充方式,即以数据平均值填充。通过这样的方式,我们比较轻松的完成了上文所提出的几个要求。
通过 Range
查询,我们可以很优雅的在 SQL 中表达时序查询。弥补了 SQL 在时序查询上描述能力不足的问题,并且可以结合 SQL 强大的表达能力,实现更加复杂的数据查询功能。
Range
查询还有更灵活的使用方式,具体使用参见文档: https://docs.greptime.com/reference/sql/range
更多实现逻辑请点击文档链接进行参考。
关于 Greptime 的小知识:
Greptime 格睿科技于 2022 年创立,目前正在完善和打造时序数据库 GreptimeDB,格睿云 GreptimeCloud 和可观测工具 GreptimeAI 这三款产品。
GreptimeDB 是一款用 Rust 语言编写的时序数据库,具有分布式、开源、云原生和兼容性强等特点,帮助企业实时读写、处理和分析时序数据的同时降低长期存储成本;GreptimeCloud 可以为用户提供全托管的 DBaaS 服务,能够与可观测性、物联网等领域高度结合;GreptimeAI 为 LLM 量身打造,提供成本、性能和生成过程的全链路监控。
GreptimeCloud 和 GreptimeAI 已正式公测,欢迎关注公众号或官网了解最新动态!
GitHub: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2024 年 Kotlin Multiplatform 发展路线图 | 官方博客
记得加关注, Kotlin 之路不迷路! Kotlinlang.org 随着 Kotlin Multiplatform 最近稳定,世界各地的开发团队已经可以在生产中无缝、舒适地采用它。不过,这对于 KMP 及其生态系统来说仅仅是一个开始。为了让您获得优良的跨平台开发体验,JetBrains 计划在 2024年对核心 Kotlin Multiplatform 技术、Compose Multiplatform、KMP 工具和 KMP 库做出一系列深入改进。本文将介绍我们在这些领域的计划和优先事项。 Compose Multiplatform 我们致力于将 Compose Multiplatform打造成框架,供开发者创建在所有支持的平台上都一致、美观且高性能的应用程序。目前,我们的主要关注点是让 Compose for iOS 进入 Beta 版阶段,但同时也在推进其他事项。我们的计划: 使所有 Jetpack Compose 核心 API 和组件实现多平台。 提高 iOS 端的渲染性能。 使 Compose for iOS 应用中的滚动和文本编辑行为与 iOS 原生应用中的行为相同。...
- 下一篇
Java表达式引擎选型调研分析
一、简介 我们项目组主要负责面向企业客户的业务系统,企业的需求往往是多样化且复杂的,对接不同企业时会有不同的定制化的业务模型和流程。我们在业务系统中使用表达式引擎,集中配置管理业务规则,并实现实时决策和计算,可以提高系统的灵活性和响应能力,从而更好地满足业务的需求。 举个简单的例子,假设我们有一个业务场景,在返利系统中,当推广员满足一定的奖励条件时,就会给其对应的奖励金额。例如某个产品的具体奖励规则如下: 这个规则看起来很好实现,只要在代码里写几个if else分支就可以了。但是如果返利系统对接了多家供应商,且每家提供的产品的奖励规则都不同呢?再通过硬编码的方式写if else似乎就不太好了,每次增加修改删除规则都需要系统发版上线。 引入规则引擎似乎就能解决这个问题,规则引擎的一个好处就是可以使业务规则和业务代码分离,从而降低维护难度,同时它还可以满足业务人员通过编写DSL或通过界面指定规则的诉求,这样就可以在没有开发人员参与的情况下建立规则了,这种说法听起来似乎很有道理,但在实践中却很少行得通。首先,规则引擎有一定的学习成本,即使开发人员使用也需要进行专门的学习,更何况没有任何...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2全家桶,快速入门学习开发网站教程