【问题标题】:Comparing value to that of previous row depending on different field根据不同的字段将值与上一行的值进行比较
【发布时间】:2013-04-08 23:51:54
【问题描述】:

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

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

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

我一直在研究写一个游标,但一直在阅读关于游标是如何非常低效的。

希望这有意义。

【问题讨论】:

  • 如果您使用的是 SQL Server 2012,则可以使用 lag() 函数访问“上一个”行中的值。
  • 2005 不幸的是:(

标签: sql sql-server compare


【解决方案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]

【讨论】:

  • 谢谢,我只是想修改我自己的 sql 来尝试让它工作
  • 似乎没有计算最后一行
【解决方案2】:

我认为这样的事情会奏效。但我可能需要更多关于表结构的信息

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

【讨论】:

猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
相关资源
最近更新 更多