我有一个基于时间戳的数据集.
Date Value 07-Jul-15 12:05:00 1 07-Jul-15 12:10:00 1 07-Jul-15 12:15:00 1 07-Jul-15 12:20:00 0 07-Jul-15 12:25:00 0 07-Jul-15 12:30:00 0 07-Jul-15 12:35:00 1 07-Jul-15 12:40:00 1 07-Jul-15 12:45:00 1 07-Jul-15 12:50:00 1 07-Jul-15 12:55:00 0 07-Jul-15 13:00:00 0 07-Jul-15 13:05:00 1 07-Jul-15 13:10:00 1 07-Jul-15 13:15:00 1 07-Jul-15 13:20:00 0 07-Jul-15 13:25:00 0
我想查询并返回
- Number of shutdowns: The Number of shut down in this case is 3 based on 0 is ON and 1 is OFF.
Period Between every shut down
Example:
- From: 07-Jul-15 12:05:00 To: 07-Jul-15 12:15:00 Duration : 15 Mins
- From: 07-Jul-15 12:35:00 To: 07-Jul-15 12:50:00 Duration : 20 Mins
我正在使用Oracle
解决方法
在ORACLE中使用LEAD和LAG函数可以构建这些查询:
1.停机次数:
WITH IntTable AS ( SELECT * FROM ( SELECT dt b_date,value,LEAD(dt) OVER (ORDER BY dt) e_date FROM ( select "Date" dt,"Value" value,LAG("Value") OVER (ORDER BY "Date") pvalue,LEAD("Value") OVER (ORDER BY "Date") nvalue from T ) T1 WHERE pvalue is NULL or value<>pvalue or nvalue is NULL ) WHERE E_DATE is NOT NULL ) SELECT COUNT(*) FROM IntTable where value = 0
2.每次关闭之间的时间
WITH IntTable AS ( SELECT * FROM ( SELECT dt b_date,LEAD("Value") OVER (ORDER BY "Date") nvalue from T ) T1 WHERE pvalue is NULL or value<>pvalue or nvalue is NULL ) WHERE E_DATE is NOT NULL ) SELECT b_date,e_date,(e_date-b_date) * 60 * 24 FROM IntTable where value = 1