[英]go to next row when a column contain certain value (sql server 2008)
这是我正在使用的表格的示例(24小时制)
|ID |Name |Department |InOutID|Date | Hours | Minutes|
________________________________________________________________________
0123 | Phil Jones | security |1 |2018-07-07| 7 |30
________________________________________________________________________
0123 | Phil Jones | security |2 |2018-07-07| 10 |30
_________________________________________________________________________
0123 | Phil Jones | security |1 |2018-07-07| 13 |30
_________________________________________________________________________
0123 | Phil Jones | security |2 |2018-07-07| 17 |00
我正在使用计分系统数据库,因此基本上我需要做的是验证IdInOut
列是否为1,然后是否为条目,如果其2为退出,那么我应该计算出epmloyee花费的真实时间在办公室(表按日期,小时,分钟等顺序排序)通常,IdInOUt应该是这样的
|IDInOut|
_________
2
_________
1
_________
2
_________
1
.....
基本上我需要做的是设置一个游标指向第一行,另一个游标指向第二行,对于每次迭代,我从第一个游标中减去第二个游标的小时和分钟,并将它们存储到变量中,然后在以后使用太好了,但是上一张表存在问题,如下所示:
|ID |Name |Department |InOutID|Date | Hours | Minutes|
________________________________________________________________________
0123 | Phil Jones | security |1 |2018-07-07|7 |30
________________________________________________________________________
0123 | Phil Jones | security |1 |2018-07-07|7 |32
_________________________________________________________________________
0123 | Phil Jones | security |2 |2018-07-07|10 |30
_________________________________________________________________________
0123 | Phil Jones | security |1 |2018-07-07|13 |30
_________________________________________________________________________
0123 | Phil Jones | security |2 |2018-07-07|17 |00
有连续的行具有相同的IdInOut,这代表了一个问题,因为我的工作方法是每次前面提到的每次迭代都使每个游标跳2行,但是在这种情况下,每个游标只应跳一行,在这种情况下我没有无法找到解决方案:/我知道解释时间很长,但是我真的被困在这里,欢迎任何帮助
有一种相对有效的方法来确定数据是否正确-差不多。 它将确定数据中是否缺少“ 1”或“ 2”。 此版本无法确定第一个ID是否为“ 1”,因为您的问题没有提及。
最好的解决方案是使用lag()
和lead()
。 但是,SQL Server 2008不支持这些功能。 因此,让我们将其作为隔gap。 对于给定的id
是否存在连续超过1个“ 1”或“ 2”的情况? 以下代码应找到这些异常:
select id, inoutid, count(*) as num_in_row,
from (select t.*,
row_umber() over (partition by id, inoutid order by date, hours, minute) as seqnum_ii,
row_umber() over (partition by id order by date, hours, minute) as seqnum_i
from t
) t
group by id, inoutid, (seqnum_i - seqnum_ii)
having count(*) > 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.