sql-server - 计算单个表中其他行之后的行,均受 where 子句限制
问题描述
我正在使用 SQL Server 2014。
我有一个包含数百万个事件的表。主键由三列组成:
- 时间日期时间
- 用户(大整数)
- 上下文(varchar(50))
我有另一列的值 (nvarchar(max))
我需要计算受限制的行数
上下文 = 'somecontext' 和 value = 'value2'
紧随其后的时间行限制在
上下文 = 'somecontext' 和 value = 'value1'
对于同一个用户。
例如具有以下记录:
时间 用户 上下文 值
2019-02-22 14:56:57 .710 359586015014836 一些上下文值1
2019-02-22 15:13:42 .887 359586015014836 somecontext value2 <----- 只需要计算这些行。
它是在第一个之后 15 分钟“记录”的,并且用户和上下文是相同的。
我见过其他类似的问题,例如this one或that one。
我应该在同一张桌子上做一个 JOIN 吗?使用子查询?可能是CTE?我担心应该是最佳的性能。
我们的想法是使用此版本的数据库引擎中可用的查询功能。
解决方案
如果我在评论中所做的示例是您想要的,那么您可以使用以下代码,假设您要选择所有行where context = 'c1'
、当前行value = 'v1'
、下一个值 = 'v3' 如果ordered by time
:
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';
推荐阅读
- postgresql - upsert 导致序列跳转
- javascript - 使用 display 属性在手风琴内显示/隐藏 div 会导致 div 永久显示
- r - 在其他数据框中搜索列值并通过属性值更改它
- javascript - 如何为所有属性都是具有不同参数的函数的对象创建泛型类型或接口?
- javascript - 函数在检查元素中返回空白数组,其中包含不可访问的数据
- tensorflow - 'ValueError:logits 和标签必须具有相同的形状 ((None, 2) vs (None, 1))'
- database - 在 Applescript/Automator 中将 .csv 表转换为数据库
- flutter - Android Studio 突然没有响应
- swift - 在 SwiftUI 中将图像遮盖到另一个图像的透明部分
- python - 如何在 imgaug 中为一张图像应用多个旋转值?(不是随机的)