在sql中分离同一表中的相关记录

在sql中分离同一表中的相关记录,sql,sql-server,Sql,Sql Server,我有一张桌子。有记录 **UserLoginAuditID EmployeeID LoginAuditCodeID LoginDate** 538544 1795 96 2013-12-19 12:26:21.187 538512 1795 137 2013-12-19 11:02:20.527 538458

我有一张桌子。有记录

**UserLoginAuditID  EmployeeID  LoginAuditCodeID    LoginDate**
538544                      1795    96                    2013-12-19 12:26:21.187
538512                      1795    137                   2013-12-19 11:02:20.527
538458                      1795    96                    2013-12-19 09:34:50.703
538249                      1795    96                    2013-12-18 13:34:41.923
538177                      1795    96                    2013-12-18 10:32:22.087
537944                      1795    96                    2013-12-17 13:08:47.860
537889                      1795    96                    2013-12-17 10:39:07.610
536560                      1795    96                    2013-12-11 14:29:54.703
536485                      1795    137                   2013-12-11 11:21:12.737
536401                      1795    96                    2013-12-11 08:34:46.183
534430                      1795    96                    2013-12-05 11:11:39.013
533942                      1795    137                   2013-12-04 12:18:03.497
LoginAuditCodeID 96表示登录,137表示注销

我想要相应的登录和注销的单独列表。 问题是存在多个登录。我们可以考虑登录前的登录记录,留下孤独的登录记录。

请帮帮我

我想要一个相应的登录和注销记录列表。 例如,在我上面给出的数据中

  538512                  1795    137                   2013-12-19 11:02:20.527
  538458                  1795    96                    2013-12-19 09:34:50.703
  536485                  1795    137                   2013-12-11 11:21:12.737
  536401                  1795    96                    2013-12-11 08:34:46.183

假设SQL Server是您的DBMS,我认为这将为您提供您想要的:

; WITH actions AS (
  SELECT UserLoginAuditID
       , EmployeeID
       , LoginAuditCodeID
       , LoginDate
       , Row_Number() OVER (PARTITION BY EmployeeID ORDER BY LoginDate) As seq
  FROM   your_table
  WHERE  LoginAuditCodeID IN (96, 137)
)
SELECT logins.*
FROM   actions As logins
 INNER
  JOIN actions As logouts
    ON logouts.EmployeeID = logins.EmployeeID
   AND logouts.seq + 1 = logins.seq
   AND logins.LoginAuditCodeID  = 96
   AND logouts.LoginAuditCodeID = 137

请告诉我您的进展情况。

您可以按如下方式获得相应的登录/注销:

select Login, Logout from
(
    select UserLoginAuditID as Logout,
     (select UserLoginAuditID from

        (select UserLoginAuditID, row_number() over (order by L2.LoginDate desc) rn
         from logtable L2 
         where LoginAuditCodeID = 96 
         and L2.LoginDate < L.LoginDate 
         and L2.EmployeeID = L.EmployeeID) Y where rn = 1
      ) Login

    from logtable L where LoginAuditCodeID = 137
) X where not login is null

你说的是日期?如2013-12-19?您使用的是什么数据库管理系统?@Tosx:相应的登录和注销。您使用的是Microsoft SQL Server吗?还是MySQL?还是甲骨文?或者其他数据库管理系统?我正在使用SQL Server。@user2087180 SQL Server?谢谢您的回复。但它不起作用。要找到相应的登录和注销,我们必须考虑日期,我认为。我在DNMS中没有那么强。编辑考虑日期和SQL Server,看看它是否工作得更好。谢谢,非常感谢新年快乐如果答案对你有效,请将其标记为已接受。新年快乐!