Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server根据列的状态更改运行总计_Sql Server - Fatal编程技术网

Sql server SQL Server根据列的状态更改运行总计

Sql server SQL Server根据列的状态更改运行总计,sql-server,Sql Server,我试图根据一个包含开始和结束日期/时间的触发器/触发器列计算一个正在运行的值总数。以下是一组示例数据: 示例输入数据: 开始日期结束日期计数触发器 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:

我试图根据一个包含开始和结束日期/时间的触发器/触发器列计算一个正在运行的值总数。以下是一组示例数据:

示例输入数据:
开始日期结束日期计数触发器
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
输出数据:
开始日期结束日期计数触发器
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
每次对触发器列进行更改时,计数列中的值都会被求和,从而该数据子集的第一行使用StartDate列,该子集的最后一行将使用EndDate列。我能够用触发器部分地进行求和,但是,第一行和最后一行DateTime我无法理解

谢谢,
HH

您可以使用
行数的差值
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);
以下是Jeff Moden的一篇文章,解释了此解决方案:


您可以使用
行数的差异:

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);
以下是Jeff Moden的一篇文章,解释了此解决方案:


这真是太棒了!谢谢你的帮助-非常优雅和直截了当。这是现场!谢谢你的帮助-非常优雅和坦率。