我有一个记录带时间戳的用户消息的表格,我需要找到每个用户在他不活动 30 天或更长时间之前发送的最后一条消息,即使该用户稍后重新参与也是如此。输出应该只包括每个用户的一个日期,这是第一次出现这样的“死窗”。
我想过自己加入表格,但我不确定我应该考虑哪些条件才能获得正确的消息....有什么想法吗?
我有一个记录带时间戳的用户消息的表格,我需要找到每个用户在他不活动 30 天或更长时间之前发送的最后一条消息,即使该用户稍后重新参与也是如此。输出应该只包括每个用户的一个日期,这是第一次出现这样的“死窗”。
我想过自己加入表格,但我不确定我应该考虑哪些条件才能获得正确的消息....有什么想法吗?
你想要的功能是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 on
or 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;