你的問題還不清楚,但以下應包含幫助你實現你真正想要的元素(請編輯的問題好像已經建議):
設置
-- 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) –