我正在尝试根据特定约束设置一个协调表的过程。 (SQL Server)
表包含以下列,
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
如何解决这个问题,我们将非常感谢任何提示。
由于
答案 0 :(得分: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+功能,允许访问&#34;后面的值#34; (或之后,如果使用负偏移作为输入)。TOP 100 PERCENT .. ORDER BY
用于确保UPDATE的顺序。虽然通常使用聚簇索引或插入记录顺序,但不能保证。实际上并不是最聪明的订购方式(在CTE中不允许订购,看起来像是黑客攻击)。