Подсчет строк, следующих за другими строками в одной таблице и ограниченных предложением where - PullRequest
0 голосов
/ 01 марта 2019

Я использую SQL Server 2014.

У меня есть таблица, содержащая несколько миллионов событий.Первичный ключ состоит из трех столбцов:

  • Время DateTime
  • user (bigint)
  • context (varchar (50))

У меня есть другой столбец со значением (nvarchar (max))

Мне нужно подсчитать строки, ограниченные

context = 'somecontext' и значением = 'value2'

, который следует во времени строки ограничены

context = 'somecontext' и значением = 'value1'

длятот же пользователь.

Например, со следующими записями:

Время пользователь контекст значение

2019-02-22 14: 56: 57 .710 359586015014836 somecontext value1

2019-02-22 15: 13: 42 .887 359586015014836 somecontext value2 <------ Нужно только считать эти строки.</p>

Он «записывается» через 15 минут после первого, и пользователь и контекст совпадают.

Я видел другие подобные вопросы, такие как этот или этот .

Должен ли я сделать JOIN на той же таблице?Использовать подзапросы?может быть CTE?Я обеспокоен тем, что производительность должна быть оптимальной.

Идея состоит в том, чтобы использовать функции запросов, доступные в этой версии механизма БД.

1 Ответ

0 голосов
/ 01 марта 2019

Если пример, который я привел в комментарии, это то, что вам нужно, вы можете использовать следующий код, предполагая, что вы хотите выбрать все строки 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';
...