2017-01-24 25 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中不允许的,看起来像对我来说)。