我有SQL其中輸出日期時間標記和狀態改變標誌的行(0或1)值到先前行的比較依賴於不同的領域
我需要從第一條記錄獲取時間跨度,標誌將爲0,狀態標誌變爲1時,忽略標誌爲1時的記錄,然後在變回0直到最後一條記錄後獲得時間跨度。狀態改變標誌可以在0和1之間任意次數翻轉。
所以我需要能夠比較狀態更改標誌與前一行,並決定是否需要不斷累積日期時間戳的差異。
我一直在尋找寫一個遊標,但不斷閱讀遊標是如何非常低效。
希望這是有道理的。
我有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
如果您在SQL Server 2012上,可以使用'lag()'函數來訪問「previous」行中的值。 – 2013-04-08 14:32:00
2005不幸:( – atamata 2013-04-08 15:33:33