![](/img/trans.png)
[英]Extracting related records from 2 columns in the same table using sql server
[英]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.