sql - 将“输入”和“输出”的几条记录分组到“会话”中。通过 SQL 查询或编程
问题描述
我有一个表(在 Microsoft Access 上,但可能在 SQL 服务器或类似服务器上),带有工作输入/输出注册表。
工作人员的每个“入”都是一条记录,其中包含他的 PersonalID、TimeOfEvent 和事件类型(“入”或“出”)。
最后——我必须计算每个“In”和“Out”之间的时间差。
但作为中间步骤 - 我想创建一个“组”查询(在 Microsoft Access 查询构建器或编写 SQL 子句中),它将为每对“In”和“Out”记录添加一个唯一的“SessionID”。所以我会有很多“会话”,每个都有 2 条记录 - 相同的 PersonID,一个“In”事件,以及晚于与其链接的“In”事件的“Out 事件”。
这样的查询会很棒,但是我也可以编写 VBA 辅助函数或更复杂的 SQL 内连接。
任何帮助,将不胜感激!
解决方案
这个问题被标记为 vb.net 所以我假设这是一个选项,即使问题说 VBA。此外,我们没有足够的信息来提供完整的解决方案,所以这里有一些可以用来做基础的代码。您需要在需要的地方填写其余部分,或者回到这里提出更具体的问题。
Public Class Session
Public PersonId As Integer
Public SessionStart As DateTime
Public SessionEnd As Nullable(Of DateTime)
Public Sub New(Id As Integer, Start As DateTime)
PersonId = Id
SessionStart = Start
End Sub
End Class
//Assumes dt contains your list of events
Public Function GetSessions(dt As DataTable) As List(Of Session)
Dim Sessions As New List(Of Session)
Dim OpenSession As Session
For Each rw As DataRow In dt.Rows
Dim id As Integer = CInt(rw("PersonID"))
OpenSession = (From s As Session In Sessions
Where s.PersonId = id AndAlso s.SessionEnd Is Nothing
Select s).FirstOrDefault()
If CBool(rw("In")) Then
If OpenSession IsNot Nothing Then
//Two In records found with no Out between. Handle that error here.
Else
Sessions.Add(New Session(id, rw("TimeOfEvent")))
End If
Else
If OpenSession Is Nothing Then
//Out record found with no matching In. Handle that error here.
Else
OpenSession.SessionEnd = rw("TimeOfEvent")
End If
End If
Next
//This code finds any unclosed sessions. Up to you whether that's an error or not. If not, just remove them from the Sessions list
Dim OpenSessions As List(Of Session) = (From s As Session In Sessions
Where s.SessionEnd Is Nothing
Select s).ToList()
Return Sessions 'This is a list of sessions containing Id, Start & End time. Do what you want with it
End Function
推荐阅读
- delphi - Delphi 64 位 Indy OpenSSL 库
- visual-studio - 如果我使用 Visual Studio Code,我会从 Visual Studio 中遗漏什么?
- python - os.getenv 返回空输出 - python
- reactjs - 有没有办法检查道具功能并将其传递到下一个级别
- java - 对象序列化到字节与杰克逊序列化从对象到 JSON?
- android - 我的本地 HttpServer 的 SSL 加密问题,未激活加密
- c++ - 拖放组合框中的项目
- flutter - 无法运行颤振运行。得到一些 androidx 错误
- r - R:如何使用来自基于网络的平台的访问令牌来验证谷歌驱动器
- asynchronous - 如何在每次调用之前动态更改路径时从 jmeter 发出异步 http 请求