2013-08-28 25 views
0

我有一個記錄時間戳的用戶消息表,並且我需要查找每個用戶發送的最後一封消息,在他停用30天或更長時間之前,即使所述用戶稍後再次訪問也是如此。輸出應該只包含每個用戶的一個日期,這是第一次出現這樣的「死窗口」。PostgreSQL:如何在不活動期間之前查找上次用戶活動,而不管再次訪問?

我想過自己加入表格,但我不確定應該考慮哪些條件才能得到正確的信息....任何想法?

回答

2

你想要的功能是lag()。下面讓你所有這樣的時期:

select m.* 
from (select m.*, lag(sentdate) over (partition by user order by sentdate) as lastsentdate 
     from messages m 
    ) m 
where lastsentdate < sentdate - 30; 

對於第一個,你可以使用distinct onrow_number()。我更喜歡後者,因爲它是標準的SQL:

select m.* 
from (select m.*, row_number() over (partition by user order by sentdate) as seqnum 
     from (select m.*, lag(sentdate) over (partition by user order by sentdate) as lastsentdate 
      from messages m 
      ) m 
     where lastsentdate < sentdate - 30 
    ) m 
where seqnum = 1; 
相關問題