在SQL中重置累积总和(不知道重置点)

在SQL中重置累积总和(不知道重置点),sql,presto,Sql,Presto,我希望通过删除与其前一个实例过近的记录来消除重复数据(在前一个实例中,接近程度取决于时间戳) 例如。 参与者1在时间1、7和15执行操作1。(时间差为6和8)。如果从上一个实例开始,我的包含阈值大于10秒,那么您可能会建议一个解决方案,比如在链接中,time_differention>10代替OOS 但是,我更喜欢只删除第二个实例的解决方案,因为第三个实例发生在第一个实例之后14秒。这需要 在先验未知时间重置的微分的累积和 我在这里设置了一个小提琴:w/schema CREATE TABLE t

我希望通过删除与其前一个实例过近的记录来消除重复数据(在前一个实例中,接近程度取决于时间戳)

例如。 参与者1在时间1、7和15执行操作1。(时间差为6和8)。如果从上一个实例开始,我的包含阈值大于10秒,那么您可能会建议一个解决方案,比如在链接中,time_differention>10代替OOS

但是,我更喜欢只删除第二个实例的解决方案,因为第三个实例发生在第一个实例之后14秒。这需要 在先验未知时间重置的微分的累积和

我在这里设置了一个小提琴:w/schema

CREATE TABLE timed_action (
    pk INT,
    actor_id INT,
    action_id INT,
    time INT,
    show INT,
    time_since_show INT
);
pk仅用于识别。演员id、动作id和时间的使用如上所述。show和time_-since_-show是手动计算的问题答案,不应使用。pk 1-3演示上述示例。仅使用DQL框中的
时滞(time,1)…
无法解决的另一组实例是pk 14-17,其中pk 15和16被删除,pk 17显示,尽管pk 16后仅出现3秒


我有一半的理由相信这不能在SQL中实现,因为使用了一些语言增强,比如PL/pgSQL或递归,这两种方法对我来说都不是一种选择——我使用的是一个分析型公司数据库(比如Amazon EMR),我无法添加语言功能。这个问题是我的万岁前简单分组(时间戳/10)。谢谢。

正如Piotr Findeisen所建议的那样,这里有一个示例片段可以实现这一点

其思想是将时间戳行转换为一个数组,其中可以使用
reduce
。在下面的示例中,我首先创建一个
db0
cte,其中所有时间戳都在一个数组中(已排序),
db1
其中我创建了一个数组
filtered\u ts
,该数组只保留满足您条件的时间戳。最终输出通过
交叉连接unnest
将数组恢复到列中

with db0 as (select actor_id, action_id, array_sort(array_agg(time)) as ts from timed_action group by 1,2),

db1 as (select actor_id, action_id, reduce(ts,array[ts[0]], (s,x)->if(x-s[-1]>10,s||x,s),s->s) as filtered_ts)

select actor_id, action_id, t0 from db1 cross join unnest(filtered_ts) t(t0)

您是否考虑过使用
array\u agg
(按
actor\u id,action\u id
分组)+
reduce
()
reduce
为您提供了许多类似PL/pgSQL的功能。@artdv。在传统的SQL中,这个问题需要一个递归CTE,而Presto不支持它。@PiotrFindeisen我确实看过这个。我使用了ARRAY_AGG w/window函数,这样每个记录都有一个前导+当前差分的数组,然后交叉连接UNNEST(只有这样我才能使用这个聚合函数,并且仍然保持所需的粒度)。。。然后数据库出错(使用文档中的示例;不确定原因;(GENERIC\u INTERNAL\u ERROR)com.facebook.presto.spi.block.IntArrayBlock)。即使没有,为了让它工作,reduce也必须按顺序运行(不查看src,不清楚它是否运行)。戈登·林诺夫,谢谢。@artdv出了什么错?浆糊里没有