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的一篇文章,解释了此解决方案:
这真是太棒了!谢谢你的帮助-非常优雅和直截了当。这是现场!谢谢你的帮助-非常优雅和坦率。