Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何回顾以前相同类型的记录_Postgresql - Fatal编程技术网

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

Postgresql 如何回顾以前相同类型的记录,postgresql,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

我试着回顾之前的匹配记录,计算出它与当前记录之间的时间差

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

如果每个独特的操作是第一次发生的,或者自该用户上次执行相同类型的操作以来至少已经过了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来执行此操作,因为我认为这是最正确的,但我无法找出如何回溯同一用户的相同操作类型的上一行记录。

您可以使用滞后窗口功能回溯该用户和操作的上一行

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;
合并就在那里,因为如果这是用户第一次执行动作timestamp-lag(timestamp,1)超过。。。将返回null