我知道我的问题从标题中不清楚,但我陷入了复杂的情况 我的表格输出为
+----+-------------+-----------+-------------------------+-------------------------+
| Id | personCount | StatusId | MinStartTime | MinEndTime |
+----+-------------+-----------+-------------------------+-------------------------+
| 1 | 3 | 1 | 2014-02-20 07:03:50.137 | 2014-02-20 07:38:33.400 |
| 2 | 3 | 8 | 2014-02-20 07:13:08.327 | 2014-02-20 07:21:28.697 |
| 3 | 3 | 2 | 2014-02-20 07:25:06.257 | 2014-02-20 07:47:32.507 |
| 4 | 4 | 1 | 2014-02-20 07:38:33.400 | 2014-02-20 12:03:03.550 |
| 5 | 4 | 2 | 2014-02-20 07:47:32.507 | 2014-02-20 08:02:10.707 |
| 6 | 4 | 8 | 2014-02-20 08:16:32.370 | 2014-02-20 11:11:02.900 |
| 7 | 4 | 8 | 2014-02-20 11:52:12.777 | 2014-02-20 12:03:03.550 |
| 8 | 0 | 1 | 2014-02-20 12:03:03.550 | 2014-02-21 05:22:45.287 |
| 9 | 2 | 1 | 2014-02-21 05:22:45.303 | 2014-02-25 10:47:22.590 |
+----+-------------+-----------+-------------------------+-------------------------+
现在,如果你看Id = 4行,它的状态是1,前一行id = 3状态是2。 第3行是Endtime大于第4行开始时间
所以我想将第4行的人数与状态id为1的前一行的人数进行比较。 id = 1并且如果人数小于我想要更新Id = 4行,人数为4-3即。 1
希望我能让它变得简单易懂。
现在我可以使用自联接获得前一行并比较值,但是我如何将该值与状态ID为1的前一行进行比较
我正在使用查询来获取此案例中的上一行
select tnext.Id,tnext.personCount
from @TableDataStatus t join
@TableDataStatus tnext
on t.id = tnext.id - 1 and
t.StatusId = 2 and
tnext.StatusId = 1 and
CONVERT(char(16),tnext.MinStartTime,120)<CONVERT(char(16),t.MinEndTime,120)
哪个会返回我Id = 4现在我该如何与上一行进行比较,状态为id = 1
答案 0 :(得分:0)
关于ID的自我加入查询将并排列出当前行和前一行
select *
from @TableDataStatus curr
left join @TableDataStatus prev on curr.id = prev.id + 1
但是其他条件(如StatusId或datetime列上的条件)会阻止为每个当前数据查找上一个数据行。
例如,以下代码仅返回第4行及其前一行
select *
from MyTables curr
left join MyTables prev on curr.id = prev.id + 1
where
prev.StatusId = 2 and
curr.StatusId = 1 and
curr.MinStartTime < prev.MinEndTime
如果第4行是唯一的目标,那么您可以测试以下UPDATE语句
UPDATE MyTables
SET
personCount = MyTables.personCount - prev.personCount
from MyTables
left join MyTables prev on MyTables.id = prev.id + 1
where
prev.StatusId = 2 and
MyTables.StatusId = 1 and
MyTables.MinStartTime < prev.MinEndTime