Ruby on Rails 将 Timescale SQL 速率代码转换为 Ruby

问题描述

我正在尝试使用时间刻度中的 Rate 函数来生成图形数据。现在我有一个数据库视图,它使用来自 TimescaleDocs 的以下 SQL 代码中的概念来执行此操作:

SELECT
  time,(
    CASE
      WHEN bytes_sent >= lag(bytes_sent) OVER w
        THEN bytes_sent - lag(bytes_sent) OVER w
      WHEN lag(bytes_sent) OVER w IS NULL THEN NULL
      ELSE bytes_sent
    END
  ) / extract(epoch from time - lag(time) OVER w) AS "bytes_per_second"
  FROM net
  WHERE interface = 'eth0' AND time > NOW() - INTERVAL '1 day'
  WINDOW w AS (ORDER BY time)
  ORDER BY time

有没有办法在时间序列模型中将其直接转换为 ruby​​ 代码以改善运行时?

解决方法

这是可能的,但我敢打赌,在 Ruby (MRI) 中构建相同的模型会比在 SQL 运行时慢得多。

您是否介意分享更多有关您遇到的性能问题的详细信息?

如果你想用 Ruby 构建它,我会说你应该考虑拥有一些“窗口概念”来负责理解某些特定数组的滞后。

示例:

a = [1,2,3,4,5]
lag = -> (i) {a[i-2] if i > 1} # => #<Proc:0x00007fcca6cf6aa0@(pry):12 a.each_with_index.map{|e,i|[e,lag[i]]}
# => [[1,nil],[2,[3,1],[4,2],[5,3]]

在本例中,我使用原始数字,但您可以使用包含时间属性的对象构建更复杂的规则。

您可以在时间周围使用一些简单的模块将时间舍入为 time_bucket。检查一些ideas here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...