我有一张大致(超级简化)的table
ts | session | other_stuff
------------------------------
100 | A | ...
101 | B | ...
101 | A | ...
102 | C | ...
103 | A | ...
104 | C | ...
104 | A | ...
9999 | D | ...
20000 | D | ...
``` `ts` 时间戳存储为双精度。我想找到任何10分钟窗口中活动会话的最大数目。所以在上面的例子中答案是 `3` 因为 `A` , `B` ,和 `C` 都在10分钟内活跃起来。对于这个问题,什么是正确的查询,我尝试了一些方法,但是遇到了错误,所以我肯定没有正确地考虑这个问题。
我试过了
SELECT *,
(
SELECT COUNT(DISTINCT session)
FROM mytable mi
WHERE mi.ts BETWEEN m.ts - 300 AND m.ts + 300
) AS maxconcurrent
FROM mytable m
ORDER BY
maxconcurrent DESC
但是收到错误
Presto query has failed. Unexpected node: com.facebook.presto.sql.planner.plan.LateralJoinNode
编辑:这里有一张表,其中窗口的滑动特性非常重要
ts | session | other_stuff
100 | A | ...
201 | B | ...
301 | A | ...
702 | C | ...
1503 | A | ...
2504 | C | ...
3696 | A | ...
9999 | D | ...
20000 | D | ...
最大值仍然是3,但现在它是从窗口覆盖201至801
2条答案
按热度按时间xpcnnkqh1#
非常有趣的问题。这是我如何接近它的
我们现在需要计算
ts
当前行的ts
上一行的(lag)
或下一行(lead)
.lag(ts,1,0)
它提供了ts
上一行的。但有一个问题,如果当前行是第一行,会发生什么?没问题,用吧lag(ts,1,0)
这个0
如果前面没有行,则返回默认值。现在我们需要做的就是减去
lag
从ts
并应用条件(您的时间窗口)。也就是说,检查电流ts - lag_ts
在600以内。有人可能会认为,如果前一行
ts
远高于当前行ts
? 但不会,因为over
子句具有order by ts
.应用distinct count gets
w8rqjzmb2#
我不是用户如果配置单元允许窗口有动态的边界宽度,它只支持固定的窗口宽度据我所知
但看看这是否对你有用。使用
floor
舍入最近的10分钟时间戳并做一个分析函数。结果如下: