SQL Oracle计数集群

前端之家收集整理的这篇文章主要介绍了SQL Oracle计数集群前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个基于时间戳的数据集.
  1. Date Value
  2. 07-Jul-15 12:05:00 1
  3. 07-Jul-15 12:10:00 1
  4. 07-Jul-15 12:15:00 1
  5. 07-Jul-15 12:20:00 0
  6. 07-Jul-15 12:25:00 0
  7. 07-Jul-15 12:30:00 0
  8. 07-Jul-15 12:35:00 1
  9. 07-Jul-15 12:40:00 1
  10. 07-Jul-15 12:45:00 1
  11. 07-Jul-15 12:50:00 1
  12. 07-Jul-15 12:55:00 0
  13. 07-Jul-15 13:00:00 0
  14. 07-Jul-15 13:05:00 1
  15. 07-Jul-15 13:10:00 1
  16. 07-Jul-15 13:15:00 1
  17. 07-Jul-15 13:20:00 0
  18. 07-Jul-15 13:25:00 0

我想查询并返回

  1. Number of shutdowns: The Number of shut down in this case is 3 based on 0 is ON and 1 is OFF.
  2. Period Between every shut down

    Example:

    1. From: 07-Jul-15 12:05:00 To: 07-Jul-15 12:15:00 Duration : 15 Mins
    2. From: 07-Jul-15 12:35:00 To: 07-Jul-15 12:50:00 Duration : 20 Mins

我正在使用Oracle

解决方法

在ORACLE中使用LEAD和LAG函数可以构建这些查询

1.停机次数

  1. WITH IntTable AS
  2. ( SELECT * FROM
  3. (
  4. SELECT dt b_date,value,LEAD(dt) OVER (ORDER BY dt) e_date FROM
  5. (
  6. select "Date" dt,"Value" value,LAG("Value") OVER (ORDER BY "Date") pvalue,LEAD("Value") OVER (ORDER BY "Date") nvalue
  7. from T
  8. ) T1
  9. WHERE pvalue is NULL or value<>pvalue or nvalue is NULL
  10. )
  11. WHERE E_DATE is NOT NULL
  12. )
  13. SELECT COUNT(*) FROM IntTable where value = 0

SQLFiddle demo

2.每次关闭之间的时间

  1. WITH IntTable AS
  2. ( SELECT * FROM
  3. (
  4. SELECT dt b_date,LEAD("Value") OVER (ORDER BY "Date") nvalue
  5. from T
  6. ) T1
  7. WHERE pvalue is NULL or value<>pvalue or nvalue is NULL
  8. )
  9. WHERE E_DATE is NOT NULL
  10. )
  11. SELECT b_date,e_date,(e_date-b_date) * 60 * 24 FROM IntTable where value = 1

SQLFiddle demo

猜你在找的MsSQL相关文章