[英]Interval addition onto date
我将尝试解释其逻辑,并希望有人能够理解和帮助我。
实际上,我正在数据库中寻找那些在首次创建帐户后的前120天内已停止交易,但自上次交易以来120天内处于非活动状态的人员。
基本上,如果某人进行了120天的交易然后停了下来,而3年后又再次进行交易,我需要他们进入此列表。 因此,使用max(transaction.created_at)
是行不通的。
希望我已经正确地解释了自己。
我假设您有以下类型的日志
table transaction
user; Timestamp
第一步是对正确的顺序进行排序
select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp
结果
user, timestamp, row_id
1 t1 1
1 t1+x 2
...
下一步是加入同一用户的连续操作
select * from
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp) a
inner join
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp)b
on a.user=b.user and a.row_id=b.row_id-1
结果:
user timestamp row user timestamp row
1 t1 1 1 t1+x 2
2 t1+x 2 1 t1+x+x2 3
...
现在您只需要按事件之间的时间间隔进行过滤
select * from
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp) a
inner join
(select t.*,
@curRow := @curRow + 1 AS row_number
from transaction t
JOIN (SELECT @curRow := 0) r
order by user, timestamp)b
on a.user=b.user and a.row_id=b.row_id+1
WHERE datediff(b.timestamp, a.timestamp)>120
现在,如果您需要在创建acc的头几天内发生交易,那么用户之间的交易中断时间会超过120天,只需添加where user in(select user from .... where datediff(min(timestamp, creation_Date)<120)
或对user_id进行内部联接以由该子查询过滤
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.