タイムスタンプ付きのユーザー メッセージを記録するテーブルがあり、各ユーザーが 30 日以上非アクティブになる前に、各ユーザーが最後に送信したメッセージを見つける必要があります。このような「デッド ウィンドウ」が初めて発生した場合、出力にはユーザーごとに 1 つの日付のみが含まれます。
テーブルをそれ自体で結合することを考えましたが、正しいメッセージを取得するためにどの条件を考慮する必要があるかわかりません....何かアイデアはありますか?
タイムスタンプ付きのユーザー メッセージを記録するテーブルがあり、各ユーザーが 30 日以上非アクティブになる前に、各ユーザーが最後に送信したメッセージを見つける必要があります。このような「デッド ウィンドウ」が初めて発生した場合、出力にはユーザーごとに 1 つの日付のみが含まれます。
テーブルをそれ自体で結合することを考えましたが、正しいメッセージを取得するためにどの条件を考慮する必要があるかわかりません....何かアイデアはありますか?
欲しい機能は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
またはを使用できます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;