mysql – 从时间戳中选择最后连续几天的数量(今天除外)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 从时间戳中选择最后连续几天的数量(今天除外),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3423字,纯文字阅读大概需要5分钟。
内容图文
![mysql – 从时间戳中选择最后连续几天的数量(今天除外)](/upload/InfoBanner/zyjiaocheng/903/b31d5b80d359416e823ba90e451284c8.jpg)
我有一个表A_DailyLogins与列ID(自动增量),键(用户ID)和日期(时间戳).我想要一个查询,它会根据Key返回那些时间戳的最后连续天数,例如,如果他有一行昨天,一天两天前,另一天三天前,但最后一行是’从四天前开始,它将返回3,因为这是用户登录的最后天数.
我的尝试是创建一个查询,选择由Date DESC订购的最后7行玩家(这是我想要的第一个,但后来我认为连续几天都很好),然后我检索了查询结果并比较了日期(转换为年/月/日与该语言的功能[Pawn]),并增加了日期在一天之前的连续日数和一天. (但与我认为只能用MySQL直接完成相比,这是非常缓慢的)
我找到的最接近的是:Check for x consecutive days – given timestamps in database.但它仍然不是我想要的,它仍然是非常不同的.我试图修改它,但这对我来说太难了,我在MySQL中没有那么多经验.
解决方法:
上下文
让连续登录期间为用户全天登录的时间段(在每个时段的A_DailyLogins中有一个条目),其中在同一用户的连续登录期之前或之后A_DailyLogins中没有条目
连续天数是连续登录期间的最大日期和最小日期之间的差异
连续登录期的最大日期在(顺序)之后没有立即登录条目.
连续登录期的最短日期之前(顺序)没有登录条目.
计划
- left join
A_DailyLogins
to itself using same user and sequential dates where right is null to find maximums- analogous logic to find minimums
- calculate row ordering over minimums and maximums with appropriate order by
- join maximums and minimums on row number
- filter where maximum login is yesterday/today
- calculate date_diff between maximum and minimum in range
- left join users to above resultset and coalesce over the case where user does not have a
consecutive login period
ending yesterday/today
输入
+----+------+------------+
| ID | Key | Date |
+----+------+------------+
| 25 | eric | 2015-12-23 |
| 26 | eric | 2015-12-25 |
| 27 | eric | 2015-12-26 |
| 28 | eric | 2015-12-27 |
| 29 | eric | 2016-01-01 |
| 30 | eric | 2016-01-02 |
| 31 | eric | 2016-01-03 |
| 32 | nusa | 2015-12-27 |
| 33 | nusa | 2015-12-29 |
+----+------+------------+
询问
select all_users.`Key`,
coalesce(nconsecutive, 0) as nconsecutive
from
(
select distinct `Key`
from A_DailyLogins
) all_users
left join
(
select
lower_login_bounds.`Key`,
lower_login_bounds.`Date` as from_login,
upper_login_bounds.`Date` as to_login,
1 + datediff(least(upper_login_bounds.`Date`, date_sub(current_date, interval 1 day))
, lower_login_bounds.`Date`) as nconsecutive
from
(
select curr_login.`Key`, curr_login.`Date`, @rn1 := @rn1 + 1 as row_number
from A_DailyLogins curr_login
left join A_DailyLogins prev_login
on curr_login.`Key` = prev_login.`Key`
and prev_login.`Date` = date_add(curr_login.`Date`, interval -1 day)
cross join ( select @rn1 := 0 ) params
where prev_login.`Date` is null
order by curr_login.`Key`, curr_login.`Date`
) lower_login_bounds
inner join
(
select curr_login.`Key`, curr_login.`Date`, @rn2 := @rn2 + 1 as row_number
from A_DailyLogins curr_login
left join A_DailyLogins next_login
on curr_login.`Key` = next_login.`Key`
and next_login.`Date` = date_add(curr_login.`Date`, interval 1 day)
cross join ( select @rn2 := 0 ) params
where next_login.`Date` is null
order by curr_login.`Key`, curr_login.`Date`
) upper_login_bounds
on lower_login_bounds.row_number = upper_login_bounds.row_number
where upper_login_bounds.`Date` >= date_sub(current_date, interval 1 day)
and lower_login_bounds.`Date` < current_date
) last_consecutive
on all_users.`Key` = last_consecutive.`Key`
;
产量
+------+------------------+
| Key | last_consecutive |
+------+------------------+
| eric | 2 |
| nusa | 0 |
+------+------------------+
有效期在2016-01-03运行
内容总结
以上是互联网集市为您收集整理的mysql – 从时间戳中选择最后连续几天的数量(今天除外)全部内容,希望文章能够帮你解决mysql – 从时间戳中选择最后连续几天的数量(今天除外)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。