mysql - 如何在 36 秒内查找并分组时间链?

标签 mysql date time range chain

  • 我有一个日期表。
  • 我想查找相差 36 秒的日期并将其分组。
  • 前一个日期与当前日期之间是否存在 36 秒的差异 下次约会?
  • 如果是,它将成为一个组,直到链的末尾。
  • 如果 36 秒链断开,则会开始一个新组。
  • 如果 36 秒内没有链,finisDate 和 dateRangeIDs 返回 null

我可以用软件来做到这一点,但这很耗时。我需要对 MySQL 进行处理。

我的日期表(日期 > %d.%m.%Y %H:%i:%s);

ID  |   Date
----+-----------------------
246 |   11.08.2014 07:54:38
247 |   11.08.2014 07:55:11
248 |   11.08.2014 07:55:45
249 |   11.08.2014 07:56:20
250 |   11.08.2014 07:56:53
251 |   11.08.2014 07:57:26
252 |   11.08.2014 07:58:01
253 |   11.08.2014 07:58:35
254 |   11.08.2014 07:59:10
255 |   11.08.2014 07:59:49
256 |   11.08.2014 07:59:58
257 |   11.08.2014 08:00:15
258 |   11.08.2014 08:00:23
259 |   11.08.2014 08:00:58
260 |   11.08.2014 08:01:01
261 |   11.08.2014 08:01:08
262 |   11.08.2014 09:12:11

预期结果:

mainID  |   startDate               |   finishDate              |   dateRangeIDs
--------+---------------------------+---------------------------+-----------------
246     |   11.08.2014 07:54:38     |   11.08.2014 07:59:10     |   247,248,249,250,251,252,253,254 
255     |   11.08.2014 07:59:49     |   11.08.2014 08:01:08     |   256,257,258,259,260,261
262     |   11.08.2014 09:12:11     |   NULL                    |   NULL

最佳答案

最简单的方法是使用lag()来获取之前的日期值。这在大多数版本的 MySQL 中都不可用。相关子查询的工作起来确实很痛苦。最后一个选项是变量:

select min(id) as mainid, min(date), max(date),
       group_concat(id order by id) as ids
from (select t.*,
             (@grp := if(@prev_date > date - interval 36 second,
                         if(@prev_date := date, @grp, @grp),  -- keep the group the same
                         if(@prev_date := date, @grp + 1, @grp + 1)
                        )
             ) as grp
      from (select t.*
            from t
            order by date
           ) t cross join
           (select @prev_date := '', @grp := 0) params
     ) t
group by grp;

编辑:

您可以通过执行以下操作删除主 ID:

select min(id) as mainid, min(date), max(date),
       substr(group_concat(id order by id), length(min(id)) + 1) as ids

关于mysql - 如何在 36 秒内查找并分组时间链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668720/

相关文章:

mysql - Varchar 还是中等文本?

php - 迄今为止添加 X 天,不包括周末

c++ - 以 int/double 形式获取以毫秒为单位的系统时间

parsing - 为什么 go 使用本地位置而不是 UTC 解析我的时间戳

php - 在日期之间搜索但提交搜索时没有显示

mysql - 当外键已经存在时添加主键

java - 如何在 YMDHMS (ISO 8601) 中获取两个日期/时间之间的持续时间

java - Android:如何正确格式化日期和时间字符串?

c++ - 在 CMake 中链接 MySQL 库

r - 在 R 中计算每个月最后 5 天的平均值