Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 如果事件每X分钟发生一次以上,则仅对事件计数一次_Sql_Postgresql - Fatal编程技术网

Sql 如果事件每X分钟发生一次以上,则仅对事件计数一次

Sql 如果事件每X分钟发生一次以上,则仅对事件计数一次,sql,postgresql,Sql,Postgresql,每次用户在我的应用程序中启动会话时,我都会填写一张表格。但是如果他们在10分钟内完成,我不想把他们的课程数超过一次。我怎么做 下面是一个从表中返回内容的示例 select * from table limit 100 +----------+--------+---------+----------------+ | event_ID | userid | city_id | created_at | +----------+--------+-----

每次用户在我的应用程序中启动会话时,我都会填写一张表格。但是如果他们在10分钟内完成,我不想把他们的课程数超过一次。我怎么做

下面是一个从表中返回内容的示例

   select
    *
    from table
    limit 100


+----------+--------+---------+----------------+
| event_ID | userid | city_id |   created_at   |
+----------+--------+---------+----------------+
|        1 | a      |       1 | 15/08/19 10:10 |
|        2 | b      |       1 | 15/08/19 10:11 |
|        3 | a      |       1 | 15/08/19 10:14 |
|        4 | a      |       1 | 15/08/19 10:25 |
|        5 | b      |       1 | 15/08/19 10:27 |
|        6 | c      |       1 | 15/08/19 10:30 |
|        7 | c      |       1 | 15/08/19 10:35 |
|        8 | d      |       1 | 15/08/19 10:40 |
|        9 | d      |       1 | 15/08/19 10:49 |
|       10 | c      |       1 | 15/08/19 10:55 |
+----------+--------+---------+----------------+
最后,我想计算每个用户的唯一事件id,前提是唯一事件id由每10分钟发生的次数定义

所以最终应该是这样的:

+--------+------------------+
| userid | unique_event_ids |
+--------+------------------+
| a      |                2 |
| b      |                2 |
| c      |                2 |
| d      |                1 |
+--------+------------------+
+--------+------------------+
| Total  |                7 |
+--------+------------------+
关于如何启动的任何建议?

使用lag确定为用户创建上一个事件的时间。然后进行一些日期筛选和聚合:

select userid, count(*)
from (select t.*,
             lag(created_at) over (partition by userid order by created_at) as prev_created_at
      from t
     ) t
where prev_created_at is null or prev_created_at < created_at - interval '10 minute'
group by userid
我会:

select
  userid,
  sum(case when created_at - interval '10 minute' < prev then 0 else 1 end)
    as unique_events_ids
from (
  select
    *,
    lag(created_at) over(partition by userid order by created_at) as prev
  from t
) x
group by userid

在你的例子中,d应该得到2以及40和51。你是对的,我忘了编辑。现在是正确的,但是如果用户“a”有4个事件呢|10:30; 10:35; 10:41; 10:42 |我应该有两个独特的事件,但我想它只算一个,对吧?@Joãopaulmachado。这只算一次。我注意到你接受了一个7分钟后发布的同等答案。我想你有你的理由。我的意思是我只能选择一个,我不认为人们会那么关心它。但你是对的,你首先回答,你接受了答案吗?但是如果用户“a”有4个事件呢|10:30; 10:35; 10:41; 10:42 |我应该有两个独特的事件,但我想它只算一个,对吗?因为它们之间的差值永远不会超过10分钟是的,使用这种逻辑它只会计算一次。此逻辑认为,自上次交互后10分钟后,新会话开始。