如何回顾相同类型的先前记录

时间:2019-05-02 15:37:48

标签: postgresql

我正在尝试回顾先前的匹配记录,以计算出当前记录之间的时间差。

上下文是我们系统上的用户能够执行某些对我们有价值的操作。我们想奖励执行这些操作的用户,但是在提供这些奖励之间有一段冷却期。

如果每个唯一操作是第一次发生,或者自该用户进行相同类型的最后操作以来已经过了至少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进行此操作,因为我认为这是最正确的方法,但是我无法弄清楚如何回顾同一用户的同一操作类型的先前记录。

1 个答案:

答案 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。