Вы можете перечислить каждый из типов и затем использовать условное агрегирование или объединение:
select user_id, seqnum,
datediff(second, min(LogDate_DT), max(LogDate_DT)) as diff_seconds
from (select t.*,
row_number() over (partition by user_id, LogAction_INT order by id) as seqnum
from t
) t
group by user_id, seqnum;
Затем вы можете суммировать их по пользователю:
select user_id, sum(diff_seconds)
from (select user_id, seqnum,
datediff(second, min(LogDate_DT), max(LogDate_DT)) as diff_seconds
from (select t.*,
row_number() over (partition by user_id, LogAction_INT order by id) as seqnum
from t
) t
group by user_id, seqnum;
) t
group by user_id;
Проблема с этим типомпроблема в том, что входы и выходы обычно не совпадают так чисто.Это делает эту проблему намного сложнее.
В поддерживаемых версиях SQL Server я бы сделал это, используя lag()
.