我將嘗試解釋邏輯並希望某人能夠理解並幫助我。加入時間間隔
實際上,我正在查找我的數據庫中的人員,他們在首次創建其帳戶的前120天內已停止交易,但自上次交易以來已停用120天。
基本上,如果有人交易120天然後停止,3年後他們再次交易,我需要他們進入這個名單。所以使用max(transaction.created_at)
是不行的。
希望我已經正確地解釋了我自己。
我將嘗試解釋邏輯並希望某人能夠理解並幫助我。加入時間間隔
實際上,我正在查找我的數據庫中的人員,他們在首次創建其帳戶的前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
現在你有過休息時間超過交易 如果在120天的使用者的lsit之間的時間跨度來過濾您需要在創建acc之後的幾天內發生這種情況,只需添加where user in(select user from .... where datediff(min(timestamp, creation_Date)<120)
或在user_id上進行內部聯接,以便按子查詢進行篩選即可,每次只需填寫
感謝您的回覆! 我很明顯waaaaaaaay背後你因爲我努力理解這整個事情。對不起,如果這聽起來很蠢,但究竟是「@curRow」? –
我不斷收到與此代碼語法的多個錯誤。 @curRow之後的「:」給了我一個錯誤,並且在JOIN(Select ...)行之後還有另一個語法錯誤。 –
第二個currow查詢在mysql上工作,而不是在postgres上。 Postgres有row_number()如果我記得正確,所以你的子查詢woudl看起來像「選擇t。*,row_number()從用戶的表順序,時間戳」你沒有提到你使用的是哪個數據庫,我給你的解決方案一個會變得複雜:D – AdrianBR
任何交易發生,您是否存儲交易的日期? – Jhanvi
請添加表格結構。 –
這不是一個通過created_at desc limit 1 offset 1簡單的命令嗎? –