繁体   English   中英

列包含特定值时转到下一行(SQL Server 2008)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM