MySQL设备的启动和停止时间

MySQL设备的启动和停止时间,mysql,sql,Mysql,Sql,我有一个带有趋势数据的数据库,结构如下: [Timestamp, System_State] 2012-01-01 00:00:00, 1 2012-01-01 00:01:00, 1 2012-01-01 00:02:00, 0 2012-01-01 00:03:00, 1 2012-01-01 00:04:00, 1 2012-01-01 00:05:00, 0 ... 现在,我需要编写一个SQL查询,以了解系统何时启动,系统状态从0变为1,何时停止,状态从1变为0。除了使用游标,我还有其

我有一个带有趋势数据的数据库,结构如下:

[Timestamp, System_State]
2012-01-01 00:00:00, 1
2012-01-01 00:01:00, 1
2012-01-01 00:02:00, 0
2012-01-01 00:03:00, 1
2012-01-01 00:04:00, 1
2012-01-01 00:05:00, 0
...
现在,我需要编写一个SQL查询,以了解系统何时启动,系统状态从0变为1,何时停止,状态从1变为0。除了使用游标,我还有其他选择吗


谢谢。

像这样的东西怎么样这是T-SQL,即SQL Server,但可能也适用于MySql

declare @t table (eventTime datetime, eventState bit)

insert @t select '2012-01-01 00:00:00', 1
union all select '2012-01-01 00:01:00', 1
union all select '2012-01-01 00:02:00', 0
union all select '2012-01-01 00:03:00', 1
union all select '2012-01-01 00:04:00', 1
union all select '2012-01-01 00:05:00', 0

select *
from
(
    select eventTime, eventState, row_number() over (order by eventTime, eventState)r 
    from @t
) a
inner join
(
    select eventTime, eventState, row_number() over (order by eventTime, eventState)r 
    from @t
) b
on a.r = b.r-1
where a.eventState <> b.eventState
-或者:

select *
from @t a
where exists (
    select 1
    from @t b
    where a.eventTime > b.eventTime
    and a.eventState != b.eventState
    and not exists
    (
        select 1
        from @t c
        where a.eventTime > c.eventTime
        and b.eventTime < c.eventTime
    )
)
order by eventTime
-或


这是T-SQL,也就是SQL Server,但也可能适用于MySql

declare @t table (eventTime datetime, eventState bit)

insert @t select '2012-01-01 00:00:00', 1
union all select '2012-01-01 00:01:00', 1
union all select '2012-01-01 00:02:00', 0
union all select '2012-01-01 00:03:00', 1
union all select '2012-01-01 00:04:00', 1
union all select '2012-01-01 00:05:00', 0

select *
from
(
    select eventTime, eventState, row_number() over (order by eventTime, eventState)r 
    from @t
) a
inner join
(
    select eventTime, eventState, row_number() over (order by eventTime, eventState)r 
    from @t
) b
on a.r = b.r-1
where a.eventState <> b.eventState
-或者:

select *
from @t a
where exists (
    select 1
    from @t b
    where a.eventTime > b.eventTime
    and a.eventState != b.eventState
    and not exists
    (
        select 1
        from @t c
        where a.eventTime > c.eventTime
        and b.eventTime < c.eventTime
    )
)
order by eventTime
-或


找到这些边缘并不困难。但是,除非你清楚地描述你的预期结果/需求,否则很难给出具体的答案。MySQL不支持窗口函数。这是正常的做法。有些方法可以用于一些基本的SQL窗口操作。找到这些边并不困难。但是,除非你清楚地描述你的预期结果/需求,否则很难给出具体的答案。MySQL不支持窗口函数。这是正常的做法。有一些方法可以用于使用原始SQL的一些更基本的窗口操作;就你的问题而言,我是否掌握了正确的方向;只是我的实现在MySQL上不起作用,或者我误解了您的意图?如果是前者,我已经用一种更简单的方式重写了SQL,这更可能在MySQL上工作;就你的问题而言,我是否掌握了正确的方向;只是我的实现在MySQL上不起作用,或者我误解了您的意图?如果是前者,我已经用一种更简单的方式重写了SQL,这更可能在MySQL上工作。