[英]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.