你的问题还不清楚,但以下应包含帮助你实现你真正想要的元素(请编辑的问题好像已经建议):
设置
-- drop table DatesAndTimes
create table DatesAndTimes
(
RowNo INT NOT NULL IDENTITY(1, 1),
StartTime DATETIME2,
EndTime DATETIME2,
Status INT,
Hours INT
)
GO
insert into DatesAndTimes (StartTime, EndTime, Status, Hours) VALUES
('20170101', '20170102', 1, 5),
('20170102', '20170103', 1, 6),
('20170104', '20170105', 2, 4),
('20170105', '20170107', 2, 3),
('20170110', '20170111', 3, 2)
测试
select * from DatesAndTimes
begin tran
;with cte as (
select TOP 100 PERCENT RowNo, StartTime, EndTime, Status, Hours,
LAG(EndTime) OVER (ORDER BY RowNo) PrevEndTime,
LAG(Status) OVER (ORDER BY RowNo) PrevStatus,
LAG(Hours) OVER (ORDER BY RowNo) PrevHours
from DatesAndTimes
order by RowNo
)
update Dest
SET Dest.Hours = (
CASE WHEN C.StartTime = C.PrevEndTime AND C.Status = C.PrevStatus THEN C.Hours + C.PrevHours
ELSE C.Hours
END)
from cte AS C
join DatesAndTimes Dest ON Dest.RowNo = C.RowNo
select * from DatesAndTimes
rollback
begin tran.. rollback
被放置,因为我不实际更新表中的初始数据。在进行更新时应该放弃它们。
LAG
是一个SQL Server 2012+函数,允许从“后面”(或之后,如果使用负偏移量作为输入)访问值。
TOP 100 PERCENT .. ORDER BY
被放置以确保UPDATE的顺序。虽然它通常使用聚集索引或插入记录顺序,但不能保证。不是真的,这是最聪明的方式(CTE中不允许的,看起来像对我来说)。
什么是你的RDBMs?解决方案可能会彼此不同。此外,你试图解决它的是什么?请记住,SO不是免费的服务代码。 –
看起来像一个非常基本的SQL查询 - 可以是“SUM() - GROUP BY ...”或“SUM()OVER(PARTITION BY .. ORDER BY)”。但没有包含示例数据的表格,我无法分辨。添加一个示例输入表,其中包含所有列的数据(“Note”除外),其中结束时间等于下一行的开始时间以及这种情况不是真的情况 - 以及示例输出数据表。我认为〜10个输入行应该足够了。 – marcothesane
** [edit] **您的问题,并根据该数据添加一些样本数据和预期的输出。 [**格式化文本**](http://stackoverflow.com/help/formatting)请,[无屏幕截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload图像-的代码上那么当-要价-A-问题/ 285557#285557) –