2009-04-28 55 views
0

我被困住了搞清楚下面的工作SQL查詢:
我需要基於Access數據庫生成一個火情登記報告(有多少人仍在樓內),該數據庫記錄登錄/以及一些元數據註銷事件。 的Access數據庫看起來是這樣的:生成火情登記報告

 
+----+---------------------+---------+---------+------+ 
| id | date    | action | success | user | 
+----+---------------------+---------+---------+------+ 
| 1 | 2009-04-28 02:00:00 | login |  1 | Nick | 
| 2 | 2009-04-28 03:00:00 | logout |  1 | Nick | 
| 3 | 2009-04-28 04:00:00 | login |  1 | Nick | 
| 4 | 2009-04-28 04:00:00 | logout |  1 | Nick | 
| 5 | 2009-04-28 04:00:00 | login |  1 | Nick | 
| 6 | 2009-04-28 07:00:00 | login |  1 | John | 
| 7 | 2009-04-28 07:30:00 | login |  1 | Sue | 
| 8 | 2009-04-28 08:00:00 | logout |  1 | John | 
+----+---------------------+---------+---------+------+ 

白天可以有多個登錄/退出動作。 當管理員運行報告,這只是限制了當前日期和需要列出所有用戶,其中該用戶的最後已知的動作是login和成功= 1,這意味着此人目前正處於建設。

關於上面的數據,尼克必須指出,仍然是在建築物內。

+0

如果他們有一個成功登錄,然後登錄失敗,他們還要被認爲是在建築物內?這似乎是他們應該,但你的問題的措辭是在那一個不是100%清楚。 – 2009-04-28 15:39:18

回答

1

另一種解決問題的方法:

SELECT 
    T1.user 
FROM 
    Some_Table T1 
LEFT OUTER JOIN Some_Table T2 ON 
    T2.user = T1.user AND 
    T2.success = 1 AND 
    T2.date > T1.date 
WHERE 
    T1.success = 1 AND 
    T1.action = 'login' AND 
    T2.id IS NULL 

這是假設你只在乎成功的行動。此外,如果用戶在同一個確切的日期和時間兩個動作那麼它可能無法按預期行事。

0

**對不起錯字原

SELECT  f.[User], la.MostRecent, f.[action] 
FROM   
(
    SELECT 
     MAX(ID) AS MaXID, 
     MAX(Date) MostRecent, 
     success, 
     [USER] 
    FROM   
     Fire 
    WHERE 
     Success = 1 
    GROUP BY 
     success, [USER] 
) AS la 
JOIN Fire f 
    ON la.MaxID = f.ID 
WHERE  ([action] = 'login') 
0

這將在SQL工作,但你必須與Access嘗試。

select * 
from events e1 
where action = login 
     and success = 1 
     and date = (select max(date) from events e2 where e1.user = e2.user) 
0

這是假設的ID總是由正數遞增,是唯一的。

SELECT LogTable.* 
FROM LogTable 
INNER JOIN (Select User, Max(ID) AS LastID 
        FROM LogTable 
        GROUP BY LogTable.User 
       ) as LastLog 
ON LogTable.User = LastLog.User 
      AND LogTable.ID = LastLog.LastID 
WHERE LogTable.success = 1 AND LogTable.action = 'login'; 

基於假設,您不必擔心日期時間不是唯一的。

希望人們不會將持有的門打開其他人誰不登錄的習慣。