Sql 根据不同字段将值与前一行的值进行比较

Sql 根据不同字段将值与前一行的值进行比较,sql,sql-server,compare,Sql,Sql Server,Compare,我有一个SQL,它输出日期时间戳行和状态更改标志0或1 我需要从第一条记录获取时间跨度,其中标志将为0,到状态标志更改为1时,忽略标志仍为1时的记录,然后获取时间跨度,在它更改回0后直到最后一条记录。状态更改标志可以在0和1之间翻转任意次数 因此,我需要能够将状态更改标志与前一行进行比较,并决定是否需要继续累积日期时间戳中的差异 我一直在研究如何编写游标,但一直在阅读有关游标效率低下的文章 希望这一切都有意义。我想这样的办法会奏效的。但是我可能需要更多关于表结构的信息 DECLARE @test

我有一个SQL,它输出日期时间戳行和状态更改标志0或1

我需要从第一条记录获取时间跨度,其中标志将为0,到状态标志更改为1时,忽略标志仍为1时的记录,然后获取时间跨度,在它更改回0后直到最后一条记录。状态更改标志可以在0和1之间翻转任意次数

因此,我需要能够将状态更改标志与前一行进行比较,并决定是否需要继续累积日期时间戳中的差异

我一直在研究如何编写游标,但一直在阅读有关游标效率低下的文章


希望这一切都有意义。

我想这样的办法会奏效的。但是我可能需要更多关于表结构的信息

DECLARE @test TABLE ([group] int,t DateTime,[status] bit)

INSERT INTO @test values (1,'20130101 11:11:11',0)
INSERT INTO @test values (1,'20130101 11:11:12',0)
INSERT INTO @test values (1,'20130101 11:11:13',0)
INSERT INTO @test values (1,'20130101 11:11:14',1)
INSERT INTO @test values (1,'20130101 11:11:15',1)
INSERT INTO @test values (1,'20130101 11:11:16',1)
INSERT INTO @test values (1,'20130101 11:11:17',0)
INSERT INTO @test values (1,'20130101 11:11:18',0)
INSERT INTO @test values (1,'20130101 11:11:19',0)


Select [Group],MIN(t)

,(Select MAX(t) from @test t2 where [status]=0 and t2.[group]=t.[group] and Exists(Select * from @test t3 where [status]=1 and t3.[group]=t.[group] and  t3.t<t2.t))
,DateDiff(ss,MIN(t)
,(Select MAX(t) from @test t2 where [status]=0 and t2.[group]=t.[group] and Exists(Select * from @test t3 where [status]=1 and t3.[group]=t.[group] and  t3.t<t2.t))
) as Seconds
from @test t where Status=0
group by [group]
WITH FirstFlag(FlagType, FlagTime)
AS
(
    SELECT 
        FlagType
        , min(DateCreated) as FlagTime
    FROM TheTable
    WHERE Flag = 0
)
, SecondFlag(FlagTime1, FlagTime2)
AS
(
    SELECT 
        F.FlagTime as FlagTime
        , min(T.DateCreated) as FlagTime
    FROM TheTable as T
        INNER JOIN FirstFlag as F
            ON T.FlagType = F.FlagType
    WHERE Flag = 1
        AND T.DateCreated > F.FlagTime
)
SELECT datediff(min, FlagTime1, FlagTime2)
FROM SecondFlag

我想这样做会奏效的。但是我可能需要更多关于表结构的信息

WITH FirstFlag(FlagType, FlagTime)
AS
(
    SELECT 
        FlagType
        , min(DateCreated) as FlagTime
    FROM TheTable
    WHERE Flag = 0
)
, SecondFlag(FlagTime1, FlagTime2)
AS
(
    SELECT 
        F.FlagTime as FlagTime
        , min(T.DateCreated) as FlagTime
    FROM TheTable as T
        INNER JOIN FirstFlag as F
            ON T.FlagType = F.FlagType
    WHERE Flag = 1
        AND T.DateCreated > F.FlagTime
)
SELECT datediff(min, FlagTime1, FlagTime2)
FROM SecondFlag

如果您在SQL Server 2012上,则可以使用lag函数访问前一行的值。2005遗憾的是:如果您在SQL Server 2012上,则可以使用lag函数访问前一行的值。2005遗憾的是:谢谢,我只是想修改我自己的sql以将其发送到Workdoe似乎不算最后一行谢谢,我只是想修改我自己的sql以将其发送到Workdoe似乎不算最后一行这实际上与我上个月发布的另一个问题有关-嗨,其实这只是一个带有两个id字段的视图,datetime stamp和flag。这实际上与我上个月发布的另一个问题有关——嗨,这实际上只是一个带有两个id字段的视图,datetime stamp和flag。