2017-01-24 16 views
0

我正在嘗試設置一個基於特定約束來協調錶的過程。 (SQL Server)的使用sql協調行

表包含以下的cols,

Start Time 
End Time 
Status 
Hours 
Note 

我的邏輯如下

starting at row 2 
if Start Time(row 2) = End time(row 1) and status(row2)=status(row1) 
then 
hours = hours(row1)+hours(2) 
move to next row 

任何提示將我應該如何處理這個問題將不勝感激。

感謝

+1

什麼是你的RDBMs?解決方案可能會彼此不同。此外,你試圖解決它的是什麼?請記住,SO不是免費的服務代碼。 –

+0

看起來像一個非常基本的SQL查詢 - 可以是「SUM() - GROUP BY ...」或「SUM()OVER(PARTITION BY .. ORDER BY)」。但沒有包含示例數據的表格,我無法分辨。添加一個示例輸入表,其中包含所有列的數據(「Note」除外),其中結束時間等於下一行的開始時間以及這種情況不是真的情況 - 以及示例輸出數據表。我認爲〜10個輸入行應該足夠了。 – marcothesane

+0

** [edit] **您的問題,並根據該數據添加一些樣本數據和預期的輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

0

你的問題還不清楚,但以下應包含幫助你實現你真正想要的元素(請編輯的問題好像已經建議):

設置

-- 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中不允許的,看起來像對我來說)。