我有一个记录会话和事件的数据库。事件表包括时间戳和用户名。一个用户可能是匿名的,或者在任何给定的会话期间登录了许多不同的用户。
我正在尝试根据事件时间戳和用户名更改时创建登录会话标识符。我可以根据时间戳对事件进行排序,并且可以看到用户名何时更改,但我无法弄清楚如何将每个事件行与其各自的“登录会话”相关联,该“登录会话”标识用户名更改时的最新事件。
我创建了这个示例来模拟我需要做的事情。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
谢谢你的帮助!