Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算SQL Server打开和关闭状态行之间的时间_Sql_Sql Server_Tsql_Time_Gaps And Islands - Fatal编程技术网

计算SQL Server打开和关闭状态行之间的时间

计算SQL Server打开和关闭状态行之间的时间,sql,sql-server,tsql,time,gaps-and-islands,Sql,Sql Server,Tsql,Time,Gaps And Islands,我使用的是SQL Server 2008,如何计算开启和关闭状态之间的时间?我有下表(按时间戳排序): 我期待这样的结果: EQUIP_ID | START | END | STATUS 1 | 21/05/2012 13:00:00 | 21/05/2012 13:05:00 | 1 (WORKING) 1 | 21/05/2012 13:05:00 | 21/05/2

我使用的是SQL Server 2008,如何计算开启和关闭状态之间的时间?我有下表(按时间戳排序):

我期待这样的结果:

EQUIP_ID |    START             |          END           | STATUS
    1    | 21/05/2012 13:00:00  |   21/05/2012 13:05:00  |   1       (WORKING)
    1    | 21/05/2012 13:05:00  |   21/05/2012 13:09:00  |   0       (STOPPED)
    1    | 21/05/2012 13:09:00  |   21/05/2012 13:13:00  |   1
    1    | 21/05/2012 13:13:00  |   21/05/2012 13:14:00  |   0
    1    | 21/05/2012 13:14:00  |   21/05/2012 13:15:00  |   1

我尝试了一些间隙和孤岛函数,但没有成功,我不知道我缺少了什么

这种方法首先过滤掉重复的on行和重复的off行。在只剩下状态开关的情况下,可以通过基于
行号搜索下一行来检索“结束时间”

; with  numbered as
        (
        select  row_number() over (partition by equip_id order by timestamp) rn
        ,       *
        from    YourTable
        )
,       nodups as
        (
        select  row_number() over (partition by cur.equip_id order by cur.timestamp) rn
        ,       cur.equip_id
        ,       cur.timestamp
        ,       cur.status
        from    numbered cur
        left join    
                numbered prev
        on      cur.rn = prev.rn + 1
                and cur.status = prev.status
        where   prev.id is null
        )
select  cur.rn
,       cur.equip_id
,       cur.timestamp as StartTime
,       next.timestamp as EndTime
,       cur.status
from    nodups cur
left join    
        nodups next
on      next.rn = cur.rn + 1
        and next.equip_id = cur.equip_id

以下是我对它的看法。假设您的表名为“MyData”:

它利用
行编号()
功能来确定每个
设备ID的状态变化。然后,它只需查找状态开始的时间(
MIN([TIMESTAMP])
),然后我将其与下一行的结束时间(
MAX([TIMESTAMP])
)进行匹配(请参见
RowNum
上的自联接)。
其中
消除了没有结束时间的最后一行。我得到的结果是:

EQUIP_ID | START                   | END                     | STATUS 
---------+-------------------------+-------------------------+-------
       1 | 2012-05-21 13:00:00.000 | 2012-05-21 13:05:00.000 |      1
       1 | 2012-05-21 13:05:00.000 | 2012-05-21 13:09:00.000 |      0
       1 | 2012-05-21 13:09:00.000 | 2012-05-21 13:13:00.000 |      1
       1 | 2012-05-21 13:13:00.000 | 2012-05-21 13:14:00.000 |      0
       1 | 2012-05-21 13:14:00.000 | 2012-05-21 13:15:00.000 |      1

也许这个示例可以让您开始:使用这个示例,我无法获得正确的间隔,例如:第一个工作行将返回结束时间13:04而不是13:05。。。
WITH operating AS
(
    SELECT
        d.EQUIP_ID
        , d.[TIMESTAMP]
        , d.[STATUS]
        , ROW_NUMBER() OVER (PARTITION BY EQUIP_ID ORDER BY [TIMESTAMP]) RowNum
        , ROW_NUMBER() OVER (PARTITION BY EQUIP_ID ORDER BY [TIMESTAMP]) -
            ROW_NUMBER() OVER (PARTITION BY EQUIP_ID, [STATUS] ORDER BY [TIMESTAMP]) AS [Group]
    FROM 
        MyData d
)
SELECT 
    state1.EQUIP_ID
    , MIN(state1.[TIMESTAMP]) [START]
    , MAX(state2.[TIMESTAMP]) [END]
    , state1.STATUS 
FROM 
    operating state1
LEFT JOIN
    operating state2 
    ON 
    state1.RowNum = state2.RowNum - 1
WHERE
    state2.[TIMESTAMP] IS NOT NULL
GROUP BY  
    state1.EQUIP_ID, state1.[STATUS], state1.[Group]
ORDER BY 
    MIN(state1.[TIMESTAMP])
EQUIP_ID | START                   | END                     | STATUS 
---------+-------------------------+-------------------------+-------
       1 | 2012-05-21 13:00:00.000 | 2012-05-21 13:05:00.000 |      1
       1 | 2012-05-21 13:05:00.000 | 2012-05-21 13:09:00.000 |      0
       1 | 2012-05-21 13:09:00.000 | 2012-05-21 13:13:00.000 |      1
       1 | 2012-05-21 13:13:00.000 | 2012-05-21 13:14:00.000 |      0
       1 | 2012-05-21 13:14:00.000 | 2012-05-21 13:15:00.000 |      1