sql - 如何在 QuestDB 上使用滞后(偏移)窗口函数?

标签 sql database time-series window-functions questdb

我知道QuestDB有一些窗口函数,但仍然不支持lag。我一直在使用 LT JOINS 来获取上一行的值。这并不理想(查询比需要的更详细并且连接性能更高),但它有效。

但是,我现在需要从上一行和之前的行中获取值。有了lag,我可以使用 offset 参数,但如果没有它,我就会迷失方向。

在其他数据库中我可以这样写:

SELECT timestamp, 
price, 
Lag(price, 1) OVER(ORDER BY timestamp) AS price1, 
Lag(price, 2) OVER(ORDER BY timestamp) AS price2
FROM table

因此每一行都会显示价格,加上之前第 1 行和第 2 行的价格。

有什么想法可以在 QuestDB 上得到这个吗?谢谢

最佳答案

lag 不是 QuestDB 当前实现的窗口函数之一,但您可以使用窗口函数 first_value。通过使用行偏移,您可以获得与使用 lag 相同的结果。

例如,如果您转到questdb playground ,就可以执行

SELECT *, 
FIRST_VALUE(price) OVER (PARTITION BY symbol ORDER BY timestamp rows BETWEEN 1 PRECEDING AND 1 PRECEDING) AS price_lag_1,
FIRST_VALUE(price) OVER (PARTITION BY symbol ORDER BY timestamp rows BETWEEN 2 PRECEDING AND 2 PRECEDING) AS price_lag_2
FROM 
trades 
WHERE timestamp IN '2023-11-30T10'
AND symbol = 'BTC-USD'

您应该获得前两行的价格以及每行的当前价格。

enter image description here

关于sql - 如何在 QuestDB 上使用滞后(偏移)窗口函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77580593/

相关文章:

sql - SQL语法错误,不是我的查询

java - 执行存储过程时调用异常时获取错误数量或类型的参数

java - 是每个数据库引擎 (jdbc) 的 Sql 语法

Python:在字符串周围插入双引号或单引号

在未知周期(时间序列)中检测位置的算法

database - 如何将 Scylla DB 中的计数器列重置为零?

PHP:从数据库获取数据并使用 while 循环

php - 数据库表不与任何其他表关联

machine-learning - 根据标记数据找到分割n维时间序列的点

r - 时间序列图