0

タイムスタンプ付きのユーザー メッセージを記録するテーブルがあり、各ユーザーが 30 日以上非アクティブになる前に、各ユーザーが最後に送信したメッセージを見つける必要があります。このような「デッド ウィンドウ」が初めて発生した場合、出力にはユーザーごとに 1 つの日付のみが含まれます。

テーブルをそれ自体で結合することを考えましたが、正しいメッセージを取得するためにどの条件を考慮する必要があるかわかりません....何かアイデアはありますか?

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 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;
于 2013-08-28T01:20:17.870 に答える