我有一个保存文档的集合,每个文档都有一个数据观察和捕获数据的时间。例如{ _key:....,“data”:26,“timecaptured”:1643488638.946702 }其中现在捕捉的时间是UTC时间戳。我想做的是得到连续观察之间的持续时间,用SQL我可以用LAG来做这个,但是用ArangoDB和AQL我很难在数据库中看到如何做这个。所以有效地在时间顺序上两个文档之间的时间戳的差异。我有很多数据,我真的不想把它们都拉到panda中。任何帮助都非常感谢。
iovurdzv1#
虽然CodeManX提供的解决方案可以工作,但我更喜欢另一种解决方案:
FOR d IN docs SORT d.timecaptured WINDOW { preceding: 1 } AGGREGATE s = SUM(d.timecaptured), cnt = COUNT(1) LET timediff = cnt == 1 ? null : d.timecaptured - (s - d.timecaptured) RETURN timediff
我们只需计算前一个文档和当前文档的总和,然后减去当前文档的timecaptured,就可以计算出前一个文档的timecaptured,这样就可以轻松计算出所需的差值。我只使用COUNT返回第一个文档的null(它没有前一个文档),如果第一个文档的差值为零,您可以简单地删除它。然而,这两种方法都不是非常直接或明显的。我在我的TODO列表中添加了一个可以在WINDOW和COLLECT操作中使用的APPEND聚合函数。
timecaptured
COUNT
null
APPEND
qrjkbowd2#
WINDOW函数不能直接访问滑动窗口中的数据,但这里有一个相当聪明的解决方法:
WINDOW
FOR doc IN collection SORT doc.timecaptured WINDOW { preceding: 1 } AGGREGATE d = UNIQUE(KEEP(doc, "_key", "timecaptured")) LET timediff = doc.timecaptured - d[0].timecaptured RETURN MERGE(doc, {timediff})
UNIQUE()函数可用于窗口聚合,并可用于获取所需的数据(上一个文档)。聚合整个文档可能效率不高,因此应该使用投影,但请记住UNIQUE()将删除重复值。文档_key在集合中是唯一的,因此我们可以将其添加到投影中以确保UNIQUE()不会删除任何内容。时间差的计算方法是将当前文档的值减去前一个文档的值timecaptured。对于第一条记录,d[0]实际上等于当前文档,差值最终为0。我认为这是明智的。你也可以写d[-1].timecaptured - d[0].timecaptured来实现同样的目的。另一方面,d[1].timecaptured - d[0].timecaptured将为您提供第一条记录的反转时间戳,因为d[1]是null(没有以前的文档),并且计算结果为0。有一个风险:UNIQUE()可能会改变文档的顺序。您可以使用子查询再次按timecaptured进行排序:
UNIQUE()
_key
d[0]
0
d[-1].timecaptured - d[0].timecaptured
d[1].timecaptured - d[0].timecaptured
d[1]
LET timediff = doc.timecaptured - ( FOR dd IN d SORT dd.timecaptured LIMIT 1 RETURN dd.timecaptured )[0]
但是使用子查询的性能并不好,相反,可以使用聚合变量d来访问两个文档,并计算减法的绝对值,这样顺序就不重要了:
d
LET timediff = ABS(d[-1].timecaptured - d[0].timecaptured)
2条答案
按热度按时间iovurdzv1#
虽然CodeManX提供的解决方案可以工作,但我更喜欢另一种解决方案:
我们只需计算前一个文档和当前文档的总和,然后减去当前文档的
timecaptured
,就可以计算出前一个文档的timecaptured
,这样就可以轻松计算出所需的差值。我只使用
COUNT
返回第一个文档的null
(它没有前一个文档),如果第一个文档的差值为零,您可以简单地删除它。然而,这两种方法都不是非常直接或明显的。我在我的TODO列表中添加了一个可以在WINDOW和COLLECT操作中使用的
APPEND
聚合函数。qrjkbowd2#
WINDOW
函数不能直接访问滑动窗口中的数据,但这里有一个相当聪明的解决方法:UNIQUE()
函数可用于窗口聚合,并可用于获取所需的数据(上一个文档)。聚合整个文档可能效率不高,因此应该使用投影,但请记住UNIQUE()
将删除重复值。文档_key
在集合中是唯一的,因此我们可以将其添加到投影中以确保UNIQUE()
不会删除任何内容。时间差的计算方法是将当前文档的值减去前一个文档的值
timecaptured
。对于第一条记录,d[0]
实际上等于当前文档,差值最终为0
。我认为这是明智的。你也可以写d[-1].timecaptured - d[0].timecaptured
来实现同样的目的。另一方面,d[1].timecaptured - d[0].timecaptured
将为您提供第一条记录的反转时间戳,因为d[1]
是null
(没有以前的文档),并且计算结果为0
。有一个风险:
UNIQUE()
可能会改变文档的顺序。您可以使用子查询再次按timecaptured
进行排序:但是使用子查询的性能并不好,相反,可以使用聚合变量
d
来访问两个文档,并计算减法的绝对值,这样顺序就不重要了: