1

ユーザー名に基づいて Time Machine を介して従業員のチェックイン時刻を格納するテーブルがあります。従業員が複数回パンチすると、チェックインの複数のレコードが存在します。最初のレコードから 1 分以内のレコードはすべて無効であり、削除する必要があります。最初のレコードから 1 分以上経過したレコードが有効であり、削除してはならない場合。次に、この 2 番目の有効なレコードには、この 2 番目の有効なレコードから 1 分以内に来るため、無効な後続のレコードも含まれる場合があります。そのようなレコードも削除する必要があります。現在の日付の従業員のすべてのチェックイン レコードに対してどのように行うことができますか? フラグ フィールドは db にはありません。どのレコードが有効で、どのレコードが無効かを示すだけです。

The Data in the db is as follows.

Username               Checktime                       CheckType          Flag
 HRA001            7/29/2012 8:16:44 AM                Check-In           Valid 
 HRA001            7/29/2012 8:16:46 AM                Check-In           Invalid
 HRA001            7/29/2012 8:16:50 AM                Check-In           Invalid
 HRA001            7/29/2012 8:17:30 AM                Check-In           Invalid 
 HRA001            7/29/2012 8:17:50 AM                Check-In           Valid 
 HRA001            7/29/2012 8:17:53 AM                Check-In           Invalid
 HRA001            7/29/2012 8:18:40 AM                Check-In           Invalid
 HRA001            7/29/2012 8:18:54 AM                Check-In           Valid 
 HRA001            7/29/2012 8:18:56 AM                Check-In           Invalid
 HRA001            7/29/2012 8:18:58 AM                Check-In           Invalid
 HRA001            7/29/2012 8:19:55 AM                Check-In           Valid
 HRA001            7/29/2012 8:20:58 AM                Check-In           Valid
4

2 に答える 2

1

これを試して:

;WITH users_CTE as 
(
 select *,row_number() over (partition by Username order by Checktime) as row from users
)
,CTE as(
select row,Username,Checktime,CheckType,0 as totalSeconds,'N' as Delflag from users_CTE where row=1 
union all
select t.row,t.Username,t.Checktime,t.CheckType,CASE WHEN (c.totalSeconds + DATEDIFF(SECOND,c.Checktime,t.Checktime))  >= 60 then 0 else (c.totalSeconds + DATEDIFF(SECOND,c.Checktime,t.Checktime)) end as totalSeconds,
CASE WHEN (c.totalSeconds + DATEDIFF(SECOND,c.Checktime,t.Checktime))  >= 60 then 'N' else 'Y' end as Delflag
--CASE WHEN c.totalSeconds <= 60  then 'Y' else 'N' end as Delflag
from users_CTE t inner join CTE c
on t.row=c.row+1
)

select Username,Checktime,CheckType,Delflag from CTE
于 2012-08-08T06:09:52.647 に答える
0
;WITH users_CTE as 
(
 select *,row_number() over (partition by USER_NAME order by CHECKTIME) as row from daily_machine_data
WHERE Convert(varchar(10),CHECKTIME,101) = Convert(varchar(10),GetDate(),101) AND USER_NAME='HRA002'
)
,CTE as(
select row,USERID,USER_NAME,CHECKTIME,CHECKTYPE,VERIFYCODE,CHK_DATE,CHK_TIME,IP_ADDRESS,MACHINE_NO,0 as totalSeconds,'N' as Delflag from users_CTE where row=1 
union all
select t.row,t.USERID,t.USER_NAME,t.CHECKTIME,t.CHECKTYPE,t.VERIFYCODE,t.CHK_DATE,t.CHK_TIME,t.IP_ADDRESS,t.MACHINE_NO,
CASE WHEN (c.totalSeconds + DATEDIFF(SECOND,c.CHECKTIME,t.CHECKTIME))  >= 60 then 0 else (c.totalSeconds + DATEDIFF(SECOND,c.CHECKTIME,t.CHECKTIME)) end as totalSeconds,
CASE WHEN (c.totalSeconds + DATEDIFF(SECOND,c.CHECKTIME,t.CHECKTIME))  >= 60 then 'N' else 'Y' end as Delflag
--CASE WHEN c.totalSeconds <= 60  then 'Y' else 'N' end as Delflag
from users_CTE t inner join CTE c
on t.row=c.row+1
)
INSERT INTO TempMachineData(USERID,USER_NAME,CHECKTIME,CHECKTYPE,VERIFYCODE,CHK_DATE,CHK_TIME,IP_ADDRESS,MACHINE_NO)
select USERID,USER_NAME,CHECKTIME,CHECKTYPE,VERIFYCODE,CHK_DATE,CHK_TIME,IP_ADDRESS,MACHINE_NO from CTE
WHERE Delflag='N'

DELETE FROM daily_machine_data 
WHERE USER_NAME = 'HRA002' AND Convert(varchar(10),CHECKTIME,101) = Convert(varchar(10),GetDate(),101)

INSERT INTO daily_machine_data(USERID,USER_NAME,CHECKTIME,CHECKTYPE,VERIFYCODE,CHK_DATE,CHK_TIME,IP_ADDRESS,MACHINE_NO)
select USERID,USER_NAME,CHECKTIME,CHECKTYPE,VERIFYCODE,CHK_DATE,CHK_TIME,IP_ADDRESS,MACHINE_NO from TempMachineData

DELETE FROM TempMachineData
于 2012-08-08T10:58:58.100 に答える