cql - ScyllaDB窗口函数式查询
问题描述
我正在使用 ScyllaDB 开源版本 4.4。
我试图弄清楚如何编写一个查询,如果这是一个具有完整 SQL 的传统关系数据库,我将使用窗口函数或 UNION 集合运算符完成。
简化的表模式:
CREATE TABLE mykeyspace.mytable (
name text ,
timestamp_utc_nanoseconds bigint ,
value bigint ,
PRIMARY KEY( (name),timestamp_utc_nanoseconds )
) WITH CLUSTERING ORDER BY (timestamp_utc_nanoseconds DESC);
我的查询需要计算并返回 6 个值,每个值都是前几分钟的“值”平均值。
在伪代码中:
SELECT AVG(value) AS one_min_avg_6_min_ago FROM mykeyspace.mytable WHERE name = 'some_name' AND timestamp_utc_nanoseconds >= [*6 minutes ago*] AND timestamp_utc_nanoseconds < [*5 minutes ago*];
SELECT AVG(value) AS one_min_avg_5_min_ago FROM mykeyspace.mytable WHERE name = 'some_name' AND timestamp_utc_nanoseconds >= [*5 minutes ago*] AND timestamp_utc_nanoseconds < [*4 minutes ago*];
SELECT AVG(value) AS one_min_avg_4_min_ago FROM mykeyspace.mytable WHERE name = 'some_name' AND timestamp_utc_nanoseconds >= [*4 minutes ago*] AND timestamp_utc_nanoseconds < [*3 minutes ago*];
SELECT AVG(value) AS one_min_avg_3_min_ago FROM mykeyspace.mytable WHERE name = 'some_name' AND timestamp_utc_nanoseconds >= [*3 minutes ago*] AND timestamp_utc_nanoseconds < [*2 minutes ago*];
SELECT AVG(value) AS one_min_avg_2_min_ago FROM mykeyspace.mytable WHERE name = 'some_name' AND timestamp_utc_nanoseconds >= [*2 minutes ago*] AND timestamp_utc_nanoseconds < [*1 minutes ago*];
SELECT AVG(value) AS one_min_avg_1_min_ago FROM mykeyspace.mytable WHERE name = 'some_name' AND timestamp_utc_nanoseconds >= [*1 minute ago*];
我的客户端是 C# .NET 5。我可以轻松地在客户端做任何事情。但在这种情况下,延迟将是一个大问题。
我的问题是:如何在服务器端(而不是客户端应用程序端)将这 6 个查询组合成一个结果集?
解决方案
理想情况下,您将使用 UDA - 用户定义的聚合函数,但对这些函数的支持尚未完成。同时,您可以并行执行这 6 个查询,这甚至可能更可取。
推荐阅读
- javascript - Angular 2+ 设置 ngModules 避免重复代码
- twilio - 在通过 webhook 收听时,Twilio 视频房间状态回调事件是否有任何订单?
- java - 在 Java 中查找对时降低时间复杂度
- python - 一组字符串的子集的索引
- javascript - 如何在 React 中的另一个 html 元素中嵌入 html 元素
- javascript - 如何在嵌入 [discord.js] 中发布排行榜
- c++ - 谷歌协议缓冲区。当 protobuf 构建为交叉臂时,“make install”不会生成 so 文件
- python - 如何以漂亮的格式打印二维 Python 列表?
- html - 将图像设置为按钮reactjs内的图标
- c - 如何在结构中声明数组