首页 / MYSQL / MySQL计算具有相似时间戳的行
MySQL计算具有相似时间戳的行
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL计算具有相似时间戳的行,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2677字,纯文字阅读大概需要4分钟。
内容图文
无论如何计算一组彼此接近的时间戳,但不一定是在固定的时间范围内?
即,不按小时或分钟分组,而是按当前行的时间戳与下一行的时间戳的接近程度进行分组.如果下一行在“x”秒/分钟内,则将该行添加到该组,否则开始新的分组.
鉴于此数据:
+----+---------+---------------------+
| id | item_id | event_date |
+----+---------+---------------------+
| 1 | 1 | 2013-05-17 11:59:59 |
| 2 | 1 | 2013-05-17 12:00:00 |
| 3 | 1 | 2013-05-17 12:00:02 |
| 4 | 1 | 2013-05-17 12:00:03 |
| 5 | 3 | 2013-05-17 14:05:00 |
| 6 | 3 | 2013-05-17 14:05:01 |
| 7 | 3 | 2013-05-17 15:30:00 |
| 8 | 3 | 2013-05-17 15:30:01 |
| 9 | 3 | 2013-05-17 15:30:02 |
| 10 | 1 | 2013-05-18 09:12:00 |
| 11 | 1 | 2013-05-18 09:13:30 |
| 12 | 1 | 2013-05-18 09:13:45 |
| 13 | 1 | 2013-05-18 09:14:00 |
| 14 | 2 | 2013-05-20 15:45:00 |
| 15 | 2 | 2013-05-20 15:45:03 |
| 16 | 2 | 2013-05-20 15:45:10 |
| 17 | 2 | 2013-05-23 07:36:00 |
| 18 | 2 | 2013-05-23 07:36:10 |
| 19 | 2 | 2013-05-23 07:36:12 |
| 20 | 2 | 2013-05-23 07:36:15 |
| 21 | 1 | 2013-05-24 11:55:00 |
| 22 | 1 | 2013-05-24 11:55:02 |
+----+---------+---------------------+
期望的结果:
+---------+-------+---------------------+
| item_id | total | last_date_in_group |
+---------+-------+---------------------+
| 1 | 4 | 2013-05-17 12:00:03 |
| 3 | 2 | 2013-05-17 14:05:01 |
| 3 | 3 | 2013-05-17 15:30:02 |
| 1 | 4 | 2013-05-18 09:14:00 |
| 2 | 3 | 2013-05-20 15:45:10 |
| 2 | 4 | 2013-05-23 07:36:15 |
| 1 | 2 | 2013-05-24 11:55:02 |
+---------+-------+---------------------+
解决方法:
这有点复杂.首先,您需要的是每个记录的下一个事件的时间.以下子查询在这样的时间(nexted)中添加,如果它在bounds中:
select t.*,
(select event_date
from t t2
where t2.item_id = t.item_id and
t2.event_date > t.event_date and
<date comparison here>
order by event_date limit 1
) as nexted
from t
这使用相关子查询. <日期比较>适用于您想要的任何日期比较.没有记录时,该值将为NULL.
现在,有了这些信息(nexted),有一个技巧可以进行分组.对于任何记录,它是之后的第一个事件时间,其中nexted为NULL.这将是该系列的最后一个事件.不幸的是,这需要两级嵌套的相关子查询(或与聚合的连接).结果看起来有点笨拙:
select item_id, GROUPING, MIN(event_date) as start_date, MAX(event_date) as end_date,
COUNT(*) as num_dates
from (select t.*,
(select min(t2.event_date)
from (select t1.*,
(select event_date
from t t2
where t2.item_id = t1.item_id and
t2.event_date > t1.event_date and
<date comparison here>
order by event_date limit 1
) as nexted
from t1
) t2
where t2.nexted is null
) as grouping
from t
) s
group by item_id, grouping;
内容总结
以上是互联网集市为您收集整理的MySQL计算具有相似时间戳的行全部内容,希望文章能够帮你解决MySQL计算具有相似时间戳的行所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。