Я хочу сделать дату между двумя датами в разных строках, только если строки имеют условие.
Моя таблица выглядит следующим образом, с дополнительными столбцами (например, guid)
Id | CreateDateAndTime | condition
---------------------------------------------------------------
1 | 2018-12-11 12:07:55.273 | with this
2 | 2018-12-11 12:07:53.550 | I need to compare this state
3 | 2018-12-11 12:07:53.550 | with this
4 | 2018-12-11 12:06:40.780 | state 3
5 | 2018-12-11 12:06:39.317 | I need to compare this state
с этим примером я хотел бы иметь 2 строки в моем выборе, которые представляют разницу между датами с идентификатора 5-3 и идентификатора 2-1.
На данный момент я пришел с запросом, который даетмне разница между датами с идентификаторами 5-3, 5-1 и 2-1:
with t as (
SELECT TOP (100000)
*
FROM mydatatable
order by CreateDateAndTime desc)
select
DATEDIFF(SECOND, f.CreateDateAndTime, s.CreateDateAndTime) time
from t f
join t s on (f.[guid] = s.[guid] )
where f.condition like '%I need to compare this state%'
and s.condition like '%with this%'
and (f.id - s.id) < 0
Моя проблема в том, что я не могу установить значение f.id - s.id, поскольку другие строки могутбыть между теми, на которых я хочу сделать разность.
Как я могу сделать датировку только на первых строках, которые соответствуют моим условиям?
РЕДАКТИРОВАТЬ : сделатьэто более ясно
Мое состояние - это имя события, и я хочу рассчитать время между появлением моего события 1 и моего события 2 и заполнить столбец с именем time
, например.
@ Salman Ответ действительно близок к тому, что я хочу, но не будетработать, когда мое событие 2 не происходит (чего не было в моем первоначальном примере)
, то есть в таблице, подобной следующей, будет установлено значение между идентификатором строки 5 и идентификатором строки 2
Id | CreateDateAndTime | condition
---------------------------------------------------------------
1 | 2018-12-11 12:07:55.273 | with this
2 | 2018-12-11 12:07:53.550 | I need to compare this state
3 | 2018-12-11 12:07:53.550 | state 3
4 | 2018-12-11 12:06:40.780 | state 3
5 | 2018-12-11 12:06:39.317 | I need to compare this state
код, который я изменил:
WITH cte AS (
SELECT id
, CreateDateAndTime AS currdate
, LAG(CreateDateAndTime) OVER (PARTITION BY guid ORDER BY id desc ) AS prevdate
, condition
FROM t
WHERE condition IN ('I need to compare this state', 'with this ')
)
SELECT *
,DATEDIFF(second, currdate, prevdate) time
FROM cte
WHERE condition = 'I need to compare this state '
and DATEDIFF(second, currdate, prevdate) != 0
order by id desc