セッションとイベントをログに記録するデータベースがあります。イベントテーブルには、タイムスタンプとユーザー名が含まれています。ユーザーは匿名であるか、特定のセッション中に同じ数の異なるユーザーにログインする可能性があります。
イベントのタイムスタンプとユーザー名の変更に基づいて、ログインセッション識別子を作成しようとしています。タイムスタンプに基づいてイベントを並べ替えることができ、ユーザー名がいつ変更されるかを確認できますが、すべてのイベント行を、ユーザー名が変更されたときの最新のイベントを識別するそれぞれの「ログインセッション」に関連付ける方法がわかりません。
私は、私がする必要があることをモデル化するこの例を作成しました。a.ord
は途切れのないシリーズの序数でありa.val
、値です。b.pval
シリーズの先行値です。
with a as (
select 1 AS ord, 'abc' as val union
select 2, 'xyz' union
select 3, 'abc' union
select 4, 'abc' union
select 5, 'xyz' union
select 6, 'xyz' union
select 7, 'xyz'
),
b as (
select
a1.ord as ord,
a1.val as val,
a2.val as pval
from a a1
left join a a2 on a1.ord - 1 = a2.ord
where a1.val != isnull(a2.val, '')
)
select
*
from b
上記のコードは、値がnullから "abc"に変更されたときの最初の行を含め、値が変更された行を返します。これが返されるものです:
ORD VAL PVAL
1 abc NULL
2 xyz abc
3 abc xyz
5 xyz abc
a left join b
「ORD」がa.ord、「VAL」がa.val、「CHG」がb.ordのように、どういうわけか戻る必要があります。
ORD VAL CHG
1 abc 1
2 xyz 2
3 abc 3
4 abc 3
5 xyz 5
6 xyz 5
7 xyz 5
ご協力いただきありがとうございます!