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