我正在尝试回顾先前的匹配记录,以计算出当前记录之间的时间差。
上下文是我们系统上的用户能够执行某些对我们有价值的操作。我们想奖励执行这些操作的用户,但是在提供这些奖励之间有一段冷却期。
如果每个唯一操作是第一次发生,或者自该用户进行相同类型的最后操作以来已经过了至少1个小时,则有资格获得奖励。
活动表如下:
user_id, action_id, timestamp
1, 1, 2019-01-01 13:00:00
1, 1, 2019-01-01 13:30:00
1, 1, 2019-01-01 14:30:00
2, 1, 2019-01-01 14:35:00
2, 2, 2019-01-01 14:36:00
2, 2, 2019-01-01 15:50:00
我想创建一个视图以实现以下目的
user_id, action_id, timestamp, eligible
1, 1, 2019-01-01 13:00:00, true
1, 1, 2019-01-01 13:30:00, false
1, 1, 2019-01-01 14:30:00, true
2, 1, 2019-01-01 14:35:00, true
2, 2, 2019-01-01 14:36:00, true
2, 2, 2019-01-01 15:50:00, true
我尝试过使用CTE进行此操作,因为我认为这是最正确的方法,但是我无法弄清楚如何回顾同一用户的同一操作类型的先前记录。
答案 0 :(得分:1)
您可以使用LAG窗口功能来查看该用户和操作的上一行。
SELECT user_id,
action_id,
timestamp,
CASE WHEN COALESCE(timestamp - lag(timestamp, 1)
OVER (partition by user_id, action_id),
'1 hour'::interval) >= '1 hour'::interval
THEN true
ELSE false
END
FROM activity;
合并就在这里,因为如果这是用户第一次执行该操作,则时间戳-lag(timestamp,1)OVER ...将返回null。