0

我有一个记录带时间戳的用户消息的表格,我需要找到每个用户在他不活动 30 天或更长时间之前发送的最后一条消息,即使该用户稍后重新参与也是如此。输出应该只包括每个用户的一个日期,这是第一次出现这样的“死窗”。

我想过自己加入表格,但我不确定我应该考虑哪些条件才能获得正确的消息....有什么想法吗?

4

1 回答 1

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 onor row_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;
于 2013-08-28T01:20:17.870 回答