2016-11-17 25 views
1

我想根據具有開始和結束日期/時間的觸發器列來計算總運行值。下面是一個示例組數據:基於列狀態變化的SQL Server運行總數

Sample Input Data: 
StartDate    EndDate     Count FlipFlop 
2016-08-28 16:34:15.380 2016-08-28 16:34:15.990 1 0 
2016-08-28 16:34:15.990 2016-08-28 16:34:17.973 0 0 
2016-08-28 16:34:17.973 2016-08-28 16:35:00.463 5 0 
2016-08-28 16:35:00.463 2016-08-28 16:39:30.940 48 1 
2016-08-28 16:39:30.940 2016-08-28 16:39:31.113 1 1 
2016-08-28 16:39:31.113 2016-08-28 16:40:00.923 5 0 
2016-08-28 16:40:00.923 2016-08-28 16:41:21.123 14 1 
2016-08-28 16:41:21.123 2016-08-28 16:41:21.140 1 0 

Output Data: 
StartDate    EndDate     Count FlipFlop 
2016-08-28 16:34:15.380 2016-08-28 16:35:00.463 6 0 
2016-08-28 16:35:00.463 2016-08-28 16:39:31.113 49 1 
2016-08-28 16:39:31.113 2016-08-28 16:40:00.923 5 0 
2016-08-28 16:40:00.923 2016-08-28 16:41:21.123 14 1 
2016-08-28 16:41:21.123 2016-08-28 16:41:21.140 1 0 

每次有變化至觸發器列,在計數列中的值相加,由此數據的子集的第一行使用開始日期欄,並且該子集的最後一行將使用EndDate列。我能夠得到部分與FlipFlop一起工作的總結,然而,第一行和最後一行DateTime正在逃避我。

感謝, HH

回答

0

您可以使用ROW_NUMBER S上的區別:

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(ORDER BY StartDate) - 
       ROW_NUMBER() OVER(PARTITION BY FlipFlop ORDER BY StartDate) 
    FROM tbl 
) 
SELECT 
    StartDate = MIN(StartDate), 
    EndDate  = MAX(EndDate), 
    [Count]  = SUM([Count]), 
    FlipFlop 
FROM CTE 
GROUP BY 
    rn, FlipFlop 
ORDER BY 
    MIN(StartDate); 

這是由傑夫MODEN的文章,介紹了此解決方案:

ONLINE DEMO

+0

這是現貨!感謝您的幫助 - 非常優雅和直接。 – HartHenry