1

従業員の勤務時間のログ データがあります。ここで、従業員が連続した勤務日 (土/日の週末) に同じタスクに対して同じ時間を記録したすべてのレコードにフラグを付ける必要があります。

次の例で私の問題を説明しましょう

EMP_HOUR_LOGと言う従業員の時間ログテーブルがあります:

ROW EMP_NO  TASK    DATE        HOURS   FLAG
1   1000    T1  2015-01-01  8   0
2   1000    T1  2015-01-02  8   0
3   1000    T1  2015-01-05  8   0
4   1000    T1  2015-01-06  2   0
5   1000    T2  2015-01-01  4   0
6   1000    T2  2015-01-02  3   0
7   1000    T3  2015-01-09  5   0
8   1000    T3  2015-01-12  5   0
9   1000    T3  2015-01-13  3   0
10  1001    T1  2015-01-14  3   0
11  1001    T1  2015-01-15  3   0

上記のサンプル データセットでは、行番号 1、2、3、10、および 11 の FLAG を 1 に更新する必要があります。これらのレコードは、同じ従業員が連続した日に同じタスクに入力した時間が同じエントリであるためです。

レコードごとにデータをループする以外に考えられなかったため、カーソルを使用してこれを既に実装しています。

一般的にカーソルループまたはループを回避することにより、同じことを実装するためのより良い方法を誰かが提案できるかどうかを教えてください。

ありがとう

4

3 に答える 3

0

おそらく行 7 と行 8 にもフラグ = 1 が必要です。これはクエリですが、挿入中に問題を処理する必要があると思います。

update e set e.FLAG = 1 
from [dbo].[EMP_HOUR_LOG] e
where exists
(
    select * from [dbo].[EMP_HOUR_LOG] e1 
    where e1.[TASK] = e.[TASK] 
    and e1.[EMP_NO] = e.[EMP_NO]
    and e1.[HOURS] = e.[HOURS]
    and e1.[DATE] in 
        (
        --Next work day
        dateadd(dd, case when DATENAME(dw,e.[DATE]) = 'Friday' then 3 else 1 end, e.[DATE]), 
        --Previous work day
        dateadd(dd, case when DATENAME(dw,e.[DATE]) = 'Monday' then -3 else -1 end, e.[DATE])
        )
)
于 2015-02-01T21:38:22.153 に答える
0

私は問題を少し違った方法で解決すると思います。能力があれば。この計算は、事前に解決する方がはるかに簡単です。したがって、問題セット全体を照会する代わりに、新しいレコードを挿入するときにそれを分離できます。基本的に、新しいレコードを追加し、どちらかの側にあるレコードを更新するときにフラグを設定します (日付に関して)。これには、データを常に正しい状態にするという利点があり、すべてのレコードを考慮する必要がないため、リソースの消費が少なくなります。フラグ値を導出するため。

于 2015-02-01T18:47:55.713 に答える