首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数单个表中其他行后面的行,这些行都受到where子句的限制

计数单个表中其他行后面的行,这些行都受到where子句的限制
EN

Stack Overflow用户
提问于 2019-03-01 08:12:22
回答 1查看 32关注 0票数 0

我正在使用Server 2014。

我有一张桌子,里面有几百万个事件。主键由三列组成:

  • 时间DateTime
  • 用户(bigint)
  • 上下文(varchar(50))

我有另一列的值(nvarchar(max))

我需要计算受限制的行

上下文= 'somecontext‘和value = 'value2’

中的之后,行被限制在

上下文= 'somecontext‘和value = 'value1’

同样的用户。

例如,有以下记录:

Time 用户 context value

2019-02-22 14:56:57.710 359586015014836 value1

2019-02-22 15:13:42.887 359586015014836 value2 <-只需要计算这一行。

它是“记录”后的第一个15分钟,用户和上下文是相同的。

我也见过其他类似的问题,如this onethat one

我应该在同一张桌子上加入吗?使用子查询?可能是CTE?我担心的是性能应该是最佳的。

其想法是使用这个版本的DB引擎中可用的查询特性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 09:29:19

如果我在注释中所做的示例是您想要的,那么您可以使用下面的代码,假设您要选择所有的行where context = 'c1',当前的value = 'v1',next value = 'v3‘If ordered by time

代码语言:javascript
复制
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';
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54940453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档