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

Posted

技术标签:

【中文标题】如果事件每 X 分钟发生一次以上,则仅计算一次事件【英文标题】:Counting events only once if an event happens more than once every X minutes 【发布时间】:2019-08-15 15:04:02 【问题描述】:

每次用户在我的应用程序中启动会话时,我都会填写一个表格。但如果他们在 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 |
+----------+--------+---------+----------------+

最后,我想计算每个用户的 unique event_id,前提是唯一的 event_id 由每 10 分钟发生的次数定义

所以最后应该是这样的:

+--------+------------------+
| userid | unique_event_ids |
+--------+------------------+
| a      |                2 |
| b      |                2 |
| c      |                2 |
| d      |                1 |
+--------+------------------+
+--------+------------------+
| Total  |                7 |
+--------+------------------+

关于如何开始的任何建议?

【问题讨论】:

在您的示例中 d 也应该产生 2(40 和 51) 你说得对,我忘了编辑。现在是正确的 【参考方案1】:

使用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

【讨论】:

但是如果用户 'a' 有 4 个事件呢? |10:30; 10:35; 10:41; 10:42|我应该有 2 个独特的事件,但我想它只会算作一个,对吧? @JoãoPauloMachado 。 . .这只算一次。我注意到您接受了在此之后 7 分钟 发布的等效答案。我想你有你的理由。 我的意思是我只能选择一个,我不认为人们会那么关心它。但你是对的,你先回答了,你接受答案了吗【参考方案2】:

我愿意:

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

【讨论】:

但是如果用户 'a' 有 4 个事件呢? |10:30; 10:35; 10:41; 10:42|我应该有 2 个独特的事件,但我想它只会算作一个,对吧?因为它们之间的差异永远不会超过 10 分钟 是的,使用这个逻辑它只会计算一次。此逻辑认为自上次交互后 10 分钟后开始“新会话”。

以上是关于如果事件每 X 分钟发生一次以上,则仅计算一次事件的主要内容,如果未能解决你的问题,请参考以下文章

在第一次发生的 N 天内计数事件

每 5 分钟更新一次值

从事件中提取会话

VB中timer控件每隔一小时事件发生一次 代码

vb怎么每隔一秒自动点击按钮

事件双向绑定原理