我在SQL中有一个表,其中包含我的密钥管理系统的完整事件历史记录。每个事件都是“拾取”或“返回”,即,正在收集密钥或正在返回密钥。
该表包含以下信息
示例:
1 Key_001 Pickup date User1
2 Key_002 Pickup date User2
3 Key_002 Return date User2
4 Key_003 Pickup date User2
我需要做的是显示所有当前为“提货”的行,并且不要再有新的“返回”行。
在上面的示例中,我将需要返回Key_003和Key_001,因为它们都被标记为“ Pickup”,但没有返回Key_002,因为它们已被返回。
如果我添加了5行
5 Key_002 Pickup date User3
然后,我希望也按如下所示返回此行
1 Key_001 Pickup date User1
4 Key_003 Pickup date User2
5 Key_002 Pickup date User3
然后我的计划是检查日期戳,并将其与当前服务器时间进行比较,以确定密钥在“提取”中已存在的时间-我可以这样做。
有人能指出我正确的方向吗?我真的没有任何SQL查询来显示我要去哪里,因为我有点迷路。
这是我正在使用的SQL Server。
答案 0 :(得分:0)
不清楚您使用的是哪个版本的SQL Server,除此以外,对于表所涉及的清晰定义总是很有用的。
DECLARE @MyTable AS TABLE
(
KeyCode VARCHAR(25) NOT NULL,
TypeMovement CHAR(10) NOT NULL,
DateMovement DATETIME2 NOT NULL,
UserMovement VARCHAR(20)
)
INSERT INTO @MyTable ( KeyCode ,
TypeMovement ,
DateMovement ,
UserMovement
)
VALUES ( 'Key_001' , -- KeyCode - varchar(25)
'Pickup' , -- TypeMovement - char(10)
SYSDATETIME() , -- DateMovement - datetime2
'User1' -- UserMovement - varchar(20)
),
( 'Key_001' , -- KeyCode - varchar(25)
'Return' , -- TypeMovement - char(10)
SYSDATETIME() , -- DateMovement - datetime2
'User1' -- UserMovement - varchar(20)
),
( 'Key_002' , -- KeyCode - varchar(25)
'Pickup' , -- TypeMovement - char(10)
SYSDATETIME() , -- DateMovement - datetime2
'User2' -- UserMovement - varchar(20)
),
( 'Key_003' , -- KeyCode - varchar(25)
'Pickup' , -- TypeMovement - char(10)
SYSDATETIME() , -- DateMovement - datetime2
'User2' -- UserMovement - varchar(20)
);
; WITH MyCTE AS
(
SELECT KeyCode,
TypeMovement,
LEAD(TypeMovement) OVER(PARTITION BY KeyCode ORDER BY DateMovement) AS NextMovementAssociated,
DateMovement,
UserMovement
FROM @MyTable
)
SELECT MyCTE.KeyCode,MyCTE.TypeMovement,MyCTE.DateMovement,MyCTE.UserMovement FROM MyCTE
WHERE MyCTE.NextMovementAssociated IS NULL AND MyCTE.TypeMovement='Pickup';