2016-11-17 73 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