首页 > 解决方案 > 将“输入”和“输出”的几条记录分组到“会话”中。通过 SQL 查询或编程

问题描述

我有一个表(在 Microsoft Access 上,但可能在 SQL 服务器或类似服务器上),带有工作输入/输出注册表。

工作人员的每个“入”都是一条记录,其中包含他的 PersonalID、TimeOfEvent 和事件类型(“入”或“出”)。

最后——我必须计算每个“In”和“Out”之间的时间差。

但作为中间步骤 - 我想创建一个“组”查询(在 Microsoft Access 查询构建器或编写 SQL 子句中),它将为每对“In”和“Out”记录添加一个唯一的“SessionID”。所以我会有很多“会话”,每个都有 2 条记录 - 相同的 PersonID,一个“In”事件,以及晚于与其链接的“In”事件的“Out 事件”。

这样的查询会很棒,但是我也可以编写 VBA 辅助函数或更复杂的 SQL 内连接。

任何帮助,将不胜感激!

标签: sqlsql-servervb.netms-access

解决方案


这个问题被标记为 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

推荐阅读