Sql查询获取前一行并根据其他列比较时间

时间:2014-03-05 05:33:59

标签: sql sql-server sql-server-2008

我知道我的问题从标题中不清楚,但我陷入了复杂的情况 我的表格输出为

+----+-------------+-----------+-------------------------+-------------------------+
| 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

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