【问题标题】:Select data having count > 1 in any interval of 1 hour在 1 小时的任何时间间隔内选择 count > 1 的数据
【发布时间】:2016-12-11 12:00:49
【问题描述】:

我正在使用 MySql。假设我有一个带有日志的表,如下所示:

+---------+---------------------+------------+
| user_id |      timestamp      |   event    |
+---------+---------------------+------------+
|       1 | 2016-12-11 01:00:00 | some event |
|       2 | 2016-12-11 01:00:00 | some event |
|       2 | 2016-12-11 03:00:00 | some event |
|       3 | 2016-12-11 01:59:00 | some event |
|       3 | 2016-12-11 02:00:00 | some event |
+---------+---------------------+------------+

我想了解同一用户在任何间隔 1 小时内登录超过 1 次的情况。

所以,我希望查询返回以下数据:

+---------+---------------------+------------+
| user_id |      timestamp      |   event    |
+---------+---------------------+------------+
|       3 | 2016-12-11 01:59:00 | some event |
|       3 | 2016-12-11 02:00:00 | some event |
+---------+---------------------+------------+

有可能吗?

【问题讨论】:

  • between 运算符有什么问题?你可以做timestamp between t1 and t2

标签: mysql sql select count group-by


【解决方案1】:

你可以使用exists:

select l.*
from logs l
where exists (select 1
              from logs l2
              where l2.user_id = l.user_id and
                    l2.timestamp = l.timestamp and
                    l2.timestamp between date_sub(l.timestamp, interval 1 hour) and
                                         date_add(l.timestamp, interval 1 hour)
            );

注意:要获取这两行,您需要检查前一小时和一小时后。

【讨论】:

  • 这将返回所有行。你应该消除自我参照。
  • @DuduMarkovitz 。 . .那很好笑。当我第一次开始输入解决方案时,我打算使用两个exists(一个用于之前,一个用于之后)。 between 是最后一分钟的更改,以减少打字。
【解决方案2】:
select  *
from    t
where   exists
        (
            select      null                
            from        t as t2                
            where       t2.user_id   =  t.user_id
                    and t2.timestamp <> t.timestamp
                    and t2.timestamp between t.timestamp - interval 1 hour
                                     and     t.timestamp + interval 1 hour

        )
;            

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2021-12-21
    • 2022-10-06
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多