如何累积tsql的值

如何累积tsql的值,tsql,sql-server-2012,Tsql,Sql Server 2012,我必须解决一个问题,但不知道怎么做。我正在使用SQLServer2012 我有如下模式的数据: ----------------------------------------------------------------------------------- DriverId | BeginDate | EndDate | NextBegin | Rest in | Drive Time | Drive | | | Da

我必须解决一个问题,但不知道怎么做。我正在使用SQLServer2012

我有如下模式的数据:

 -----------------------------------------------------------------------------------
   DriverId  | BeginDate | EndDate | NextBegin | Rest in | Drive Time | Drive
             |           |         | Date      | Hours   | in Minutes | KM            
 -----------------------------------------------------------------------------------
    integer     datetime   datetime   datetime    integer    integer     decimal(10,3)

 Rest in hours = EndDate - NextBeginDate
 Drive Time in Minutes = BeginDate - EndDate
我必须搜索第一个rest=>36小时

 Do
   Compute how many days are 
   SUM(DriveTime) 
   SUM(TotalKM)
 until next rest => 36 hours
 IF No More Rest EXIT DO
 Loop
从头到尾都是被抛弃的 从最后一次休息到最后一次是放弃

我有excel表格中的数据,您可以从这里下载:


我为我的英语感到抱歉,我希望你能理解并帮助我,提前谢谢你。

查询有几个部分。第一部分提取Rest大于等于36的行,并指定一个行号。结果存储在名为BigRest的CTE中

with BigRest(RowNumber, DriverId, BeginDate, EndDate)
as
(
select ROW_NUMBER() over(partition by d.DriverId order by d.DriverId, d.BeginDate) RowNumber,d.DriverId, d.BeginDate, d.EndDate
from Drive d 
where d.Rest >= 36
)
然后,我根据BeginDate将BigRest中的行号分配给驱动器中的每一行(我称之为包含所有数据的表)。因此,数据按休息时间>=36的天数进行有效分割。每个段都有一个名为DriveGroup的数字

;with Grouped(DriverId, BeginDate, EndDate, DriveTime, DriveKM, DriveGroup)
as
(
select d.DriverId, d.BeginDate, d.EndDate, d.Drivetime, d.DriveKM, (select Top 1 RowNumber from BigRest b where b.DriverId = d.DriverId and b.BeginDate >= d.BeginDate order by b.BeginDate)
from Drive d 
)
最后,我从分组中选择数据,将其与自身的一些聚合数据交叉应用。我们可以过滤掉DriveGroup为1或null的行,因为这些行表示无关紧要的开始行和结束行(“不做任何事情”行)

这里有一个


我鼓励您在查询的每个步骤中查看结果,以了解实际情况。

此表上是否有主键?谢谢您的提问,没有定义,但可以有。根据Excel文件中的数据,您希望结果是什么样的?我需要一行:DriverId、BeginDate(在其余部分之后)、EndDate(在下一次休息之前)、天(休息之间)、和(驾驶时间)(休息之间)、和(公里)(休息之间)。希望我解释得很好。我修改了excel,所以你可以在表格底部看到一个示例。再次感谢你。Jerrad,谢谢你。我明天会试试这个并发表评论。Jerrad,非常感谢,这正是我需要的,效果非常好。当我完成这份报告时,我必须再做一个,像这样,但有一些变体,是一天的总和。再次感谢。嗨,Jerrad,我发布了另一个类似的问题,我称之为如何累积值tsql,可能是,你可以修改这个脚本并帮助我解决它。提前谢谢你。
select distinct DriverId, MinBeginDate BeginDate, MaxEndDate EndDate, DATEDIFF(D, MinBeginDate, MaxEndDate)+1 Days, DriveTimeSum Drive, DriveKMSum KM
from
(
select g.DriverId, g.BeginDate, g.EndDate, g.DriveGroup, g.DriveTime, c.DriveTimeSum, c.DriveKMSum, c.MinBeginDate, c.MaxEndDate
from Grouped g
cross apply(select SUM(g2.DriveTime) DriveTimeSum, 
               SUM(g2.DriveKM) DriveKMSum, 
               MIN(g2.BeginDate) MinBeginDate, 
               MAX(g2.EndDate) MaxEndDate 
               from Grouped g2 
               where g2.DriverId = g.DriverId 
               and g2.DriveGroup = g.DriveGroup) as c
where g.DriveGroup is not null
and g.DriveGroup > 1
) x