使用max(date)

时间:2018-12-16 19:41:47

标签: sql-server

我在SQL中有一个表,其中包含我的密钥管理系统的完整事件历史记录。每个事件都是“拾取”或“返回”,即,正在收集密钥或正在返回密钥。

该表包含以下信息

  • e_ID PK-唯一ID
  • e_KeyName
  • e_State“提取”或“返回”
  • e_datestamp-事件的日期和时间(获取date())
  • e_user每个用户的Windows登录用户名

示例:

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。

1 个答案:

答案 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';