我正在使用SQL Server 2014。
我有一个包含数百万个事件的表。主键由三列组成:
我还有另一列的值(nvarchar(max))
我需要计算限制在
上的行紧随时间行的context ='somecontext'和value ='value2'
context ='somecontext'和value ='value1'
针对同一用户。
例如具有以下记录的示例:
时间 用户 上下文 值
2019-02-22 14:56:57 .710 359586015014836 somecontext value1
2019-02-22 15:13:42 .887 359586015014836 somecontextvalue2 <------只需要计算这一行。
第一个与用户和上下文相同后15分钟被“记录”。
我还看到了其他类似的问题,例如this one或that one。
我应该在同一张桌子上加入JOIN吗?使用子查询?可能是CTE?我担心应该达到最佳性能。
想法是使用此版本的数据库引擎中可用的查询功能。
答案 0 :(得分:1)
如果我在注释中创建的示例是您想要的,则可以使用以下代码
假设您要选择所有行where context = 'c1'
,当前行value = 'v1'
,如果ordered by time
,则下一个值='v3':
declare @t table
(
Time_ DateTime,
user_ bigint,
context varchar(50),
value_ varchar(50)
);
insert into @t values
('20000101', 1, 'c1', 'v1'),
('20000102', 1, 'c2', 'v3'),
('20000103', 1, 'c1', 'v3'),
('20000104', 2, 'c1', 'v1'),
('20000105', 2, 'c1', 'v4'),
('20000106', 2, 'c1', 'v2');
with cte as
(
select *,
lead(value_) over(partition by user_ order by time_) as next_value
from @t
where context = 'c1'
)
select *
from cte
where next_value = 'v3';