久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

捕獲字段狀態(tài)更改的開始和結(jié)束時(shí)間

Capture start and end times for changes of state of a field(捕獲字段狀態(tài)更改的開始和結(jié)束時(shí)間)
本文介紹了捕獲字段狀態(tài)更改的開始和結(jié)束時(shí)間的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

這是這個(gè)問(wèn)題的變體來(lái)自單個(gè)列的 T-SQL 開始和結(jié)束日期時(shí)間,除了事件狀態(tài)可能有多個(gè)打開或關(guān)閉狀態(tài)而沒有匹配的相反狀態(tài).

This is a variation of this question T-SQL Start and end date times from a single column except the event states may have multiple on or off states without a matching opposite state.

問(wèn)題是我如何捕獲第一個(gè)開"和下一個(gè)關(guān)"的開始和結(jié)束日期.換句話說(shuō),將每個(gè)項(xiàng)目的第一個(gè) COS(狀態(tài)更改)捕獲為on",并將第一個(gè) COS 捕獲為off".這將用于計(jì)算項(xiàng)目的總運(yùn)行時(shí)間.

The question is how do I capture the start and end dates for the first "on" and next "off". In other words, capture the first COS (change of state) to "on" and the first COS to "off" for each item. This would be used to calculate a total runtime for the item.

來(lái)源:

Item      EventDate               Event
A         2011-10-03 00:01:00     On
A         2011-10-03 00:01:15     On
B         2011-10-03 00:01:00     On
A         2011-10-03 00:02:00     Off
A         2011-10-03 00:02:01     Off
C         2011-10-03 00:01:00     On
B         2011-10-03 00:02:00     Off
A         2011-10-03 00:02:02     On      
C         2011-10-03 00:02:05     On
A         2011-10-03 00:02:07     Off

輸出:

Item      Start                   End
A         2011-10-03 00:01:00     2011-10-03 00:02:00
A         2011-10-03 00:02:02     2011-10-03 00:02:07
B         2011-10-03 00:01:00     2011-10-03 00:02:00
C         2011-10-03 00:01:00     2011-10-03 00:02:05

推薦答案

如果你有 SQL Server 2012 或更高版本,那么你可以使用 SQL Servers 窗口函數(shù)來(lái)獲得所需的結(jié)果如下:

If you have SQL Server 2012 or later then you can use SQL Servers windowing function to get the desired results as follow:

CREATE TABLE [dbo].[EventStates](
    [Item] [varchar](1) NOT NULL,
    [EventDate] [varchar](19) NOT NULL,
    [Event] [varchar](3) NOT NULL
) ON [PRIMARY]

GO

INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'A', N'2011-10-03 00:01:00', N'On')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'A', N'2011-10-03 00:01:15', N'On')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'B', N'2011-10-03 00:01:00', N'On')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'A', N'2011-10-03 00:02:00', N'Off')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'A', N'2011-10-03 00:02:01', N'Off')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'C', N'2011-10-03 00:01:00', N'On')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'B', N'2011-10-03 00:02:00', N'Off')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'A', N'2011-10-03 00:02:02', N'On')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'C', N'2011-10-03 00:02:05', N'On')
INSERT [dbo].[EventStates] ([Item], [EventDate], [Event]) VALUES (N'A', N'2011-10-03 00:02:07', N'Off')

GO

;WITH StateChange
AS
(
    SELECT   E.[Item]
            ,E.[EventDate]
            ,E.[Event]
            ,(  -- First determine if a state change to on has occurred.
                CASE
                    WHEN E.[Event] = 'On' AND LAG(E.[Event], 1, NULL) OVER (PARTITION BY E.[Item] ORDER BY E.[EventDate] ASC) IS NULL THEN 1
                    WHEN E.[Event] = 'On' AND E.[Event] <> LAG(E.[Event], 1, NULL) OVER (PARTITION BY E.[Item] ORDER BY E.[EventDate] ASC) THEN 1
                    ELSE 0
                END
             ) [StateChanged]
    FROM    EventStates E
), StateChangeGrouping
AS
(
    SELECT   [Item]
            ,[EventDate]
            ,[Event]
            ,[StateChanged]
            ,SUM([StateChanged]) OVER (PARTITION BY [Item] ORDER BY [EventDate] ASC) AS [GroupID]
    FROM    StateChange 
), StateChangeRanked
AS
(
    SELECT   [Item]
            ,[EventDate]
            ,[Event]
            ,[StateChanged]
            ,[GroupID]
            ,ROW_NUMBER() OVER (PARTITION BY [Item], GroupID, [Event] ORDER BY [EventDate]) AS TransitionRank
    FROM    StateChangeGrouping
)
SELECT      [Item]
            ,MIN([EventDate]) AS [Start]
            ,MAX([EventDate]) AS [End]
            ,[GroupID]
FROM        StateChangeRanked
WHERE       GroupID > 0 AND TransitionRank = 1
GROUP BY    [Item], GroupID
ORDER BY    [Item], [Start]

以下是 SQL Server 2008 的實(shí)現(xiàn).

Below is an implementation for SQL Server 2008.

;WITH EventID
AS
(
    SELECT   ROW_NUMBER() OVER(PARTITION BY [Item] ORDER BY [EventDate]) RowNr
            ,[Item]
            ,[EventDate]
            ,[Event] 
    FROM    [dbo].[EventStates]
), StateChange
AS
(
    SELECT  C.RowNr
            ,P.RowNr AS P_RowNr
            ,C.[Item]
            ,C.[EventDate]
            ,C.[Event] 
            ,P.[Event] AS P_Event
            ,(  -- First determine if a state change to on has occurred.
                CASE
                    WHEN C.[Event] = 'On' AND P.[Event] IS NULL THEN 1
                    WHEN C.[Event] = 'On' AND C.[Event] <> P.[Event] THEN 1
                    ELSE 0
                END
                ) [StateChanged]
    FROM    EventID C
    LEFT OUTER JOIN EventID P ON C.Item = P.Item AND C.RowNr = P.RowNr + 1
), StateChangeGrouping
AS
(
    SELECT   ST1.[Item]
            ,ST1.[EventDate]
            ,ST1.[Event]
            ,ST1.[StateChanged]
            ,(
                SELECT SUM([StateChanged])
                FROM StateChange ST2
                WHERE ST2.Item = ST1.Item AND ST2.RowNr <= ST1.RowNr
             ) AS GroupID
    FROM    StateChange ST1
), StateChangeRanked
AS
(
    SELECT   [Item]
            ,[EventDate]
            ,[Event]
            ,[StateChanged]
            ,[GroupID]
            ,ROW_NUMBER() OVER (PARTITION BY [Item], GroupID, [Event] ORDER BY [EventDate]) AS TransitionRank
    FROM    StateChangeGrouping
)
SELECT      [Item]
            ,MIN([EventDate]) AS [Start]
            ,MAX([EventDate]) AS [End]
            ,[GroupID]
FROM        StateChangeRanked
WHERE       GroupID > 0 AND TransitionRank = 1
GROUP BY    [Item], GroupID
ORDER BY    [Item], [Start]

這篇關(guān)于捕獲字段狀態(tài)更改的開始和結(jié)束時(shí)間的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Modify Existing decimal places info(修改現(xiàn)有小數(shù)位信息)
The correlation name #39;CONVERT#39; is specified multiple times(多次指定相關(guān)名稱“CONVERT)
T-SQL left join not returning null columns(T-SQL 左連接不返回空列)
remove duplicates from comma or pipeline operator string(從逗號(hào)或管道運(yùn)算符字符串中刪除重復(fù)項(xiàng))
Change an iterative query to a relational set-based query(將迭代查詢更改為基于關(guān)系集的查詢)
concatenate a zero onto sql server select value shows 4 digits still and not 5(將零連接到 sql server 選擇值仍然顯示 4 位而不是 5)
主站蜘蛛池模板: 日韩精品视频在线 | 久久久久资源 | 成人在线免费电影 | 久久99精品久久久久久琪琪 | 日日操夜夜操天天操 | 黑人久久久 | 欧美成人高清视频 | 国产一区二区三区在线 | 国产91在线播放 | 国产极品粉嫩美女呻吟在线看人 | 亚洲天堂影院 | www.日韩系列 | 欧美精品久久久 | 日韩色视频 | 精品成人av | 国产一区二区精品在线观看 | 亚洲一区二区三区在线视频 | 成在线人视频免费视频 | 欧美精品成人 | 亚洲精品国产a久久久久久 午夜影院网站 | 成人福利网 | 国产精品福利在线 | 国产大学生情侣呻吟视频 | 欧美色性 | 色婷婷亚洲一区二区三区 | 精品91久久 | 中文字幕亚洲无线 | 日韩一区二区在线视频 | 羞羞视频在线网站观看 | 91视频电影 | 伦理午夜电影免费观看 | 久久久中文 | 精品在线播放 | 中文字幕av在线 | 欧美国产日韩在线观看成人 | 91精品国产91久久久久青草 | 日韩一区二区在线视频 | 日本精品视频 | www.日本在线观看 | 亚洲大片在线观看 | 国产精品欧美一区二区三区不卡 |