SQL Oracle计数集群

sza*_*ani 5 sql oracle

我有一个基于时间戳的数据集.

     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 
Run Code Online (Sandbox Code Playgroud)

我想查询并返回

  1. 停机次数:此情况下的停机次数为3,基于0为ON,1为OFF.
  2. 每次关闭之间的时间段

    例:

    1. From:07-Jul-15 12:05:00 To:07-Jul-15 12:15:00持续时间:15分钟
    2. 来自:07-Jul-15 12:35:00致:07-Jul-15 12:50:00持续时间:20分钟

我正在使用Oracle

val*_*lex 1

使用 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 
Run Code Online (Sandbox Code Playgroud)

SQLFiddle demo

2.每次关闭之间的时间段

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 b_date,e_date, (e_date-b_date) * 60 * 24 FROM IntTable where value = 1 
Run Code Online (Sandbox Code Playgroud)

SQLFiddle demo