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 个查询,这可能更可取。