sql - 当列包含特定值时转到下一行(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
.....
基本上我需要做的是设置一个指向第一行的游标和另一个指向第二行的游标,并且对于每次迭代,我从第一个游标中减去第二个游标的小时和分钟并将它们存储到一个变量中,然后使用它SO FAR SO GOOD 但是之前的表格存在问题,如下所示:
|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()
and lead()
。但是,SQL Server 2008 不支持这些函数。因此,让我们将其视为一个差距和岛屿。对于给定的,是否存在连续超过 1 个“1”或“2”的情况id
?下面的代码应该会发现这些异常:
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
推荐阅读
- javascript - 为什么 Google Chrome 中的 SpeechSynthesis.getVoices() 返回一个空列表?
- assembly - %eax, %edx, %ecx 在同一个函数框架中的使用规则
- python - 阻止 xml.etree 将特殊字符写入 HTML 代码
- mysql - 从多个表中获取所有列的最大值
- javascript - Ruby on Rails - Leaflet-rails 'ReferenceError: L is not defined'
- android - setTitleColor 在drawerlayout android studio内的backpress上不起作用
- shell - 使用 Windows 机器在 Mobaxterm 上编译 cpp 函数的 sh 文件
- r - 抽样随机行
- javascript - 无法在 Expo React 本机应用程序中清除间隔
- github - 我粘贴了用于克隆的 Github git URL,但得到:无法解析主机:github.com