SQL Server连续范围

SQL Server连续范围,sql,sql-server,Sql,Sql Server,我有以下问题,我还没有找到解决的办法。 我有一个返回以下信息的查询: id date status ignition 8B8499C5-54B0-4A78-853D-6468F6EA3132 2018-04-04 20:58:43.000 0 Acc Off 8B8499C5-54B0-4A78-853D-6468F6EA3132 2018-04-04 20:58:46.000 0

我有以下问题,我还没有找到解决的办法。 我有一个返回以下信息的查询:

id      date      status      ignition      
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:43.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:46.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:49.000            0      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:52.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:55.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:01.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:04.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:03.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:37.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:39.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:09:36.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:19:33.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:29:33.000            0      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:39:30.000            0      NULL
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:49:30.000            0      NULL
我需要将数据结果转换为:

id      date      status      ignition      
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:43.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:46.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:49.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:52.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:58:55.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:01.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:04.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:03.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:37.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 20:59:39.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:09:36.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:19:33.000            0      Acc Off
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:29:33.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:39:30.000            1      Acc On
8B8499C5-54B0-4A78-853D-6468F6EA3132      2018-04-04 21:49:30.000            1      Acc On
我正试着这样做,但没有令人满意的结果 你知道我该怎么做吗

WITH q AS
(
    SELECT  
        id,
        UTC_datetime, 
        ignition_on,
        descripcion,
        ROW_NUMBER() OVER (PARTITION BY id, descripcion ORDER BY UTC_datetime) AS rnd,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY UTC_datetime) AS rn
    FROM  
    (
        select stat.id, stat.UTC_datetime, stat.ignition_on, ala.descripcion 
        from GEOVISTA_ACTUAL.dbo.[8DF385B2AA4F43B4A2FEC99DAAD6222F_empresadispositivostatus] stat
        outer apply
        (
            select UTC_datetime, descripcion 
            from GEOVISTA_ACTUAL.dbo.[8DF385B2AA4F43B4A2FEC99DAAD6222F_empresadispositivoalarmas] ala
            where stat.package = ala.package 
        ) as ala
        where stat.id = '8b8499c5-54b0-4a78-853d-6468f6ea3132'
    ) Final
) 

SELECT 
    DATEADD(DAY, DATEDIFF(DAY, 0, UTC_datetime), 0) AS UTC_datetime,
    id, 
    descripcion
FROM    
    q

GROUP BY
    id, 
    DATEADD(DAY, DATEDIFF(DAY, 0, UTC_datetime), 0),
    descripcion, 
    rnd - rn

我通常通过将问题分为两部分来解决这一问题:

提取状态更改列表并构造该状态处于活动状态的时段 将原始列表与状态更改表联接,并提取存储的状态 第一部分。实际上只是提取具有非空点火列值的行,按日期排序,并使用LEAD window函数获取下一个日期。我们假设最后一个日期是有效的。在下面的代码中,我使用CTE表示状态查找表

第二部分。然后是一个简单的联接,用于将原始表中的每一行与状态表中的正确句点相匹配

一旦连接完成,我们就可以提取特定于周期的状态并输出正确的点火状态。你可以在这本书中看到这一点


您的数据太大,跨越多个屏幕,我们无法看到正在发生的变化。这不清楚。请突出显示问题,而不是发布整个数据。阅读第一组数据的帖子非常困难,我需要打开所有点火开关并复制它们,直到下一次点火开关关闭,然后关闭点火开关。第二组数据是我所希望的。我不知道如何处理它,这就是为什么我在某些方面寻求你的帮助。我不是被要求给我答案,只是为了指导我。
WITH StatusByPeriod AS (
SELECT
        Id
,       [Date] AS StartPeriod
,        CASE Ignition WHEN 'Acc Off' THEN 0 ELSE 1 END AS [Status]
,       LEAD([Date], 1, '9999-12-31') OVER (PARTITION BY Id ORDER BY [Date]) AS EndPeriod
FROM
        StateTable
WHERE
        Ignition IS NOT NULL
)
SELECT
        StateTable.[Id]
,       StateTable.[Date]
,       StatusByPeriod.[Status]
,       CASE StatusByPeriod.[Status] WHEN 0 THEN 'Acc Off' ELSE 'Acc On'    END AS Ignition
FROM
        StateTable
JOIN    StatusByPeriod ON (
                 StatusByPeriod.[Id] = StateTable.[Id]
        AND      StatusByPeriod.StartPeriod <= StateTable.[Date]
        AND      StatusByPeriod.EndPeriod > StateTable.[Date]
        )