2013-10-08 77 views
1

我將嘗試解釋邏輯並希望某人能夠理解並幫助我。加入時間間隔

實際上,我正在查找我的數據庫中的人員,他們在首次創建其帳戶的前120天內已停止交易,但自上次交易以來已停用120天。

基本上,如果有人交易120天然後停止,3年後他們再次交易,我需要他們進入這個名單。所以使用max(transaction.created_at)是不行的。

希望我已經正確地解釋了我自己。

+0

任何交易發生,您是否存儲交易的日期? – Jhanvi

+0

請添加表格結構。 –

+0

這不是一個通過created_at desc limit 1 offset 1簡單的命令嗎? –

回答

1

我假設你有一個日誌類型的

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上進行內部聯接,以便按子查詢進行篩選即可,每次只需填寫

+0

感謝您的回覆! 我很明顯waaaaaaaay背後你因爲我努力理解這整個事情。對不起,如果這聽起來很蠢,但究竟是「@curRow」? –

+0

我不斷收到與此代碼語法的多個錯誤。 @curRow之後的「:」給了我一個錯誤,並且在JOIN(Select ...)行之後還有另一個語法錯誤。 –

+0

第二個currow查詢在mysql上工作,而不是在postgres上。 Postgres有row_number()如果我記得正確,所以你的子查詢woudl看起來像「選擇t。*,row_number()從用戶的表順序,時間戳」你沒有提到你使用的是哪個數據庫,我給你的解決方案一個會變得複雜:D – AdrianBR