簡體   English   中英

在SQL的同一張表中分離出相關記錄

[英]Separating out related records in same table in sql

我有桌子 有記錄

**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

您可以按以下方式獲得相應的登錄/注銷:

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

我認為這可以滿足您的要求(假設將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

讓我知道你是怎么辦的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM