ScyllaDB window 类函数查询
ScyllaDB window function-like query
我正在使用 ScyllaDB 开源版本 4.4。
我想知道如何编写一个查询,如果这是一个具有完整 SQL 的传统关系数据库,我会用 window 函数或 UNION 集合运算符来完成。
简化的 table 架构:
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);
我的查询需要计算 return 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 个查询,这甚至可能更可取。
我正在使用 ScyllaDB 开源版本 4.4。
我想知道如何编写一个查询,如果这是一个具有完整 SQL 的传统关系数据库,我会用 window 函数或 UNION 集合运算符来完成。
简化的 table 架构:
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);
我的查询需要计算 return 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 个查询,这甚至可能更可取。