大佬教程收集整理的这篇文章主要介绍了检查连续 x 天 - 给定数据库中的时间戳,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
您可以使用移位自外连接和变量来完成此操作。请参阅此解决方案:
SELECT IF(count(1) > 0, 1, 0) AS has_consec
FROM
(
SELECT *
FROM
(
SELECT IF(b.login_date IS NulL, @val:=@val+1, @val) AS consec_set
FROM tbl a
CROSS JOIN (SELECT @val:=0) var_init
left JOIN tbl b ON
a.user_iD = b.user_iD AND
a.login_date = b.login_date + INTERVAL 1 DAY
WHERE a.user_iD = 1
) a
GROUP BY a.consec_set
HAVING count(1) >= 30
) a
这将返回一个1
或一个0
基于用户是否已经在连续30天或以上的记录过去。
这个查询的首当其冲的是在第一个子选择中。让我们仔细看看,以便更好地理解它是如何工作的:
使用以下示例数据集:
create table tbl (
user_iD INT,
login_date DATE
);
INSERT INTO tbl VALUES
(1, '2012-04-01'), (2, '2012-04-02'),
(1, '2012-04-25'), (2, '2012-04-03'),
(1, '2012-05-03'), (2, '2012-04-04'),
(1, '2012-05-04'), (2, '2012-05-04'),
(1, '2012-05-05'), (2, '2012-05-06'),
(1, '2012-05-06'), (2, '2012-05-08'),
(1, '2012-05-07'), (2, '2012-05-09'),
(1, '2012-05-09'), (2, '2012-05-11'),
(1, '2012-05-10'), (2, '2012-05-17'),
(1, '2012-05-11'), (2, '2012-05-18'),
(1, '2012-05-12'), (2, '2012-05-19'),
(1, '2012-05-16'), (2, '2012-05-20'),
(1, '2012-05-19'), (2, '2012-05-21'),
(1, '2012-05-20'), (2, '2012-05-22'),
(1, '2012-05-21'), (2, '2012-05-25'),
(1, '2012-05-22'), (2, '2012-05-26'),
(1, '2012-05-25'), (2, '2012-05-27'),
(2, '2012-05-28'),
(2, '2012-05-29'),
(2, '2012-05-30'),
(2, '2012-05-31'),
(2, '2012-06-01'),
(2, '2012-06-02');
这个查询:
select a.*, b.*, IF(b.login_date IS NulL, @val:=@val+1, @val) AS consec_set
FROM tbl a
CROSS JOIN (SELECT @val:=0) var_init
left JOIN tbl b ON
a.user_iD = b.user_iD AND
a.login_date = b.login_date + INTERVAL 1 DAY
WHERE a.user_iD = 1
将产生:
如您所见,我们正在做的是将@H_675_32@连接表移动@H_675_32@+1 天。对于与前一天不连续的每一天,NulL
left JOIN 会生成一个值。
现在,我们知道@H_675_32@其中非连续的日子中,我们可以使用一个变量来区分各组@H_675_32@通过检测转移表的行是否是连续数日NulL
。如果是NulL
,则日期不连续,因此只需增加变量即可。如果是NOT NulL
,则不要增加变量:
在我们用递增变量区分每组连续天数之后,只需按每个“组”(如consec_set
列中定义)进行分组并使用HAVING
过滤掉任何少于指定连续天数的组(在您的示例中为 30):
最后,我们包装查询并简单地计算连续 30 天或更多天的集合数。如果有这些集合中的一个或多个,则返回1
,否则返回0
。
以上是大佬教程为你收集整理的检查连续 x 天 - 给定数据库中的时间戳全部内容,希望文章能够帮你解决检查连续 x 天 - 给定数据库中的时间戳所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。