我有一个表,每个表ActorId
都有一个Value
,但是Value
会随着时间变化,我们会跟踪这些值的所有变化。
例:
Id ActorId Value Timestamp
--------------------------------
1 5 10 2019-01-05
2 8 8 2019-01-07
3 8 5 2019-01-08
4 5 15 2019-01-11
5 3 12 2019-01-11
6 3 7 2019-01-12
7 3 14 2019-01-14
[...]
如果我们将所有内容都加载到内存中,则很容易随时检查每个Actor
值(如果在查询日期之前从未设置过,则为null / undefined)。实际上,我实际上需要将所有这些数据发送到浏览器,并在JavaScript中执行此操作。
问题在于整个表将变得非常大。既有唯一的ActorId,也包括每个ActorId的值更改。
通常,我只需要相对较小的ActorId
s选择和较短的时间-例如两个月。
我可以做类似的事情:
SELECT *
FROM [ActorValue]
WHERE
ActorId IN (5, 8, 12, [...])
AND Timestamp >= '2019-02-01'
AND Timestamp <= '2019-04-01'
并将这些结果发送到JavaScript进行进一步处理。
问题是我也需要在周期开始时使用该值。因此,对于每个ActorId,我都需要日期范围内的值,并且在此之前需要一个值更改。
在不将所有值更改都加载到内存中的情况下解决此问题的最佳方法是什么。
所以我在理论上寻找的是这样的:
AND Timestamp >= '2019-02-01' -- plus the entry before this date, grouped by ActorId
我只会用lead()
:
SELECT av.*
FROM (SELECT av.*,
LEAD(Timestamp) OVER (PARTITION BY ActorId ORDER BY Timestamp) as next_timestamp
FROM ActorValue av
WHERE ActorId IN (5, 8, 12, [...])
) av
WHERE next_Timestamp >= '2019-02-01'
Timestamp <= '2019-04-01';
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句