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]
)