使用sql

时间:2017-01-24 17:19:31

标签: sql sql-server

我正在尝试根据特定约束设置一个协调表的过程。 (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

如何解决这个问题,我们将非常感谢任何提示。

由于

1 个答案:

答案 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中不允许订购,看起来像是黑客攻击)。