查找每个项目的特定事件的总持续时间

时间:2016-10-12 11:01:58

标签: sql sql-server oracle11g

表结构如下所示:

+-------------------------+---------------+--------------------------------------+---------+
|        timestamp        |  event_type   |               user_id                |  label  |
+-------------------------+---------------+--------------------------------------+---------+
| 2016-06-11 16:22:06.384 | SearchResults | 9df64989-9b1a-4bee-a69a-381092573185 | 4       |
| 2016-06-11 16:22:06.402 | SeeMore       | 9df64989-9b1a-4bee-a69a-381092573185 | KS31494 |
| 2016-06-11 16:22:06.708 | ServerSearch  | 152ef390-8e62-498a-b861-6586febe6f83 | 19969   |
| 2016-06-11 16:22:06.83  | ServerSearch  | 9a3706ca-da63-451b-b54c-35adbb52ad96 | 184     |
| 2016-06-11 16:22:06.912 | ServerSearch  | ab0aceba-f4f1-45df-9799-61b307290764 | 6332    |
| 2016-06-11 16:22:07.01  | DebtReminder  | 60dc13b1-ade5-43aa-82e9-37c544dc6c5d | red     |
+-------------------------+---------------+--------------------------------------+---------+

此表中的label值仅在 SeeMore 事件的情况下有意义并且表示车辆ID,否则对于给定方案而言毫无意义。

我们对每个车辆ID的所有 SeeMore 事件的总持续时间感兴趣 - 有意义的label

单独的 SeeMore evebt的持续时间被指定为 SeeMore user_id与任何后续事件之间特定event_type的时差。< / p>

如何为所有车载ID(有意义的label s)找到所有 SeeMore 事件的总持续时间?

1 个答案:

答案 0 :(得分:1)

试试这个:

select user_id,timestamp,next_timestamp-timestamp as time_diff
from
(
select 
timestamp,
user_id, 
case when event_type='SeeMore' then 1 else 0 end as SM,
lead(timestamp) over (partition by user_id order by timestamp) as next_timestamp
from event_table
)
where SM=1