首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从单个表返回最近登录的设备列表

从单个表返回最近登录的设备列表
EN

Stack Overflow用户
提问于 2013-02-14 23:16:23
回答 1查看 34关注 0票数 1

我需要修复一个SQL查询,它只返回最近登录的用户,而不是记录表中的所有登录用户。我使用的是SQL Server2008 R2。

表格如下所示:

代码语言:javascript
复制
ID  StoreID DeviceTimeStamp CreatedBy   CreatedDate UpdatedBy   UpdatedDate action  PersonID    Description
----------------------------------------------------------------------------------------------------------------------
56  82  2/11/13 8:43    Handheld Login  2/11/13 8:43    Handheld Login  2/11/13 8:43    1   97  Login
57  82  2/11/13 8:45    Handheld Login  2/11/13 8:45    Handheld Login  2/11/13 8:45    1   97  Inventory Recorded
58  82  2/11/13 8:59    Handheld Login  2/11/13 8:59    Handheld Login  2/11/13 8:59    1   97  Logout
59  82  2/11/13 9:12    Handheld Login  2/11/13 9:12    Handheld Login  2/11/13 9:12    1   97  Login
60  82  2/11/13 9:14    Handheld Login  2/11/13 9:14    Handheld Login  2/11/13 9:14    1   97  Issue Reported
61  82  2/11/13 9:14    Handheld Login  2/11/13 9:14    Handheld Login  2/11/13 9:14    1   97  Issue Reported
62  82  2/11/13 9:22    Handheld Login  2/11/13 9:22    Handheld Login  2/11/13 9:22    1   97  Logout
63  82  2/11/13 10:42   Handheld Login  2/11/13 10:42   Handheld Login  2/11/13 10:42   1   97  Login
64  82  2/11/13 10:42   Handheld Login  2/11/13 10:42   Handheld Login  2/11/13 10:42   1   97  Logout
65  82  2/11/13 11:18   Handheld Login  2/11/13 11:18   Handheld Login  2/11/13 11:18   1   97  Login
66  82  2/11/13 11:18   Handheld Login  2/11/13 11:18   Handheld Login  2/11/13 11:18   1   97  Logout
67  NULL    2/11/13 11:19   Handheld Login  2/11/13 11:19   Handheld Login  2/11/13 11:19   1   97  Travel Time
68  NULL    2/11/13 11:19   Handheld Login  2/11/13 11:19   Handheld Login  2/11/13 11:19   1   97  Travel Time (Logout)
69  NULL    2/11/13 11:19   Handheld Login  2/11/13 11:19   Handheld Login  2/11/13 11:19   1   97  Absent
70  NULL    2/11/13 11:20   Handheld Login  2/11/13 11:20   Handheld Login  2/11/13 11:20   1   97  Absent (Logout)
71  82  2/11/13 11:46   Handheld Login  2/11/13 11:46   Handheld Login  2/11/13 11:46   1   97  Login
72  82  2/11/13 13:14   Handheld Login  2/11/13 13:14   Handheld Login  2/11/13 13:14   1   97  Logout
73  NULL    2/11/13 13:14   Handheld Login  2/11/13 13:14   Handheld Login  2/11/13 13:14   1   97  Travel Time
74  NULL    2/11/13 13:17   Handheld Login  2/11/13 13:17   Handheld Login  2/11/13 13:17   1   97  Travel Time (Logout)
75  82  2/11/13 13:17   Handheld Login  2/11/13 13:17   Handheld Login  2/11/13 13:17   1   97  Login
76  82  2/12/13 11:09   Handheld Login  2/12/13 11:09   Handheld Login  2/12/13 11:09   1   97  Login
77  82  2/12/13 11:10   Handheld Login  2/12/13 11:10   Handheld Login  2/12/13 11:10   1   97  Logout
78  82  2/13/13 15:27   Handheld Login  2/13/13 15:27   Handheld Login  2/13/13 15:27   1   97  Login
79  52  2/13/13 15:49   Handheld Login  2/13/13 15:49   Handheld Login  2/13/13 15:49   1   97  Login

从该表中,我正在尝试获取有关当前登录到哪个位置的人员的最新信息。我使用的脚本只返回最后登录的人的信息,而不返回其他人的信息。从上面看,应该有1个人(PersonID)登录到2个位置(StoreID)。

我尝试删除DISTINCT,并获得该表中的行数的最后登录人员的列表。(错误)。

我不太擅长聚合函数,所以非常欢迎任何帮助修复这个查询的人。

现有代码- SQL

代码语言:javascript
复制
select DISTINCT Lin.ID,
            Lin.PersonID, 
            Lin.StoreID, 
            MAX(Lin.DeviceTimeStamp)as DeviceTimeStamp, 
            Lin.CreatedBy, 
            Lin.CreatedDate,
            Lin.UpdatedBy,
            Lin.UpdatedDate, 
            Lin.action,
             Lin.description
from 
    (select ID, 
        PersonID, 
        StoreID, 
        MAX(DeviceTimeStamp) as DeviceTimeStamp, 
        CreatedBy,
        CreatedDate, 
        UpdatedBy, 
        UpdatedDate, 
        action, 
        Description
     from KF_EDC_Logging 
    where 
        Description = 'Login' 
    group by PersonID, 
        StoreID,
        DeviceTimeStamp, 
        ID, 
        CreatedBy, 
        CreatedDate,
         UpdatedBy, 
        UpdatedDate,
         action, 
        description ) Lin 
full outer join
    (select PersonID, 
        DeviceTimeStamp as DateTimeOut, 
        CreatedBy,
        CreatedDate, 
        UpdatedBy, 
        UpdatedDate, 
        action, 
        description 
    from KF_EDC_Logging 
    where 
        Description = 'Logout')  out 
    on Lin.PersonID = out.PersonID 
Where
    (out.DateTimeOut is null OR Lin.DeviceTimeStamp in 
        (Select MAX(KF_EDC_Logging.DeviceTimeStamp) from KF_EDC_Logging))
Group BY Lin.DeviceTimeStamp, 
        Lin.PersonID, 
        Lin.StoreID, 
        out.DateTimeOut, 
        Lin.ID, 
        Lin.CreatedBy, 
        Lin.CreatedDate, 
        Lin.UpdatedBy,
        Lin.UpdatedDate, 
        Lin.action,
        Lin.description
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-15 01:51:58

这是我的尝试。它使用公用表表达式来计算上次登录的日期,然后将结果连接回其余数据。

代码语言:javascript
复制
WITH LogIn
AS
(
  SELECT PersonID, StoreID, MAX(DeviceTimeStamp) AS [DeviceTimeStamp]
  FROM KF_EDC_Logging
  WHERE Description = 'Login'
  GROUP BY PersonID, StoreID
),
LogOut
AS
(
  SELECT PersonID, StoreID, MAX(DeviceTimeStamp) AS [DeviceTimeStamp]
  FROM KF_EDC_Logging
  WHERE Description = 'Logout'
  GROUP BY PersonID, StoreID
)
SELECT K.ID, K.StoreID, LogIn.[DeviceTimeStamp], K.CreatedBy,
  K.CreatedDate, K.UpdatedBy, K.UpdatedDate, K.action,
  K.PersonID, K.Description
FROM LogIn
LEFT JOIN LogOut 
  ON LogIn.PersonID = LogOut.PersonID
  AND LogIn.StoreID = LogOut.StoreID
INNER JOIN KF_EDC_Logging AS K
  ON LogIn.PersonID = K.PersonID
  AND LogIn.StoreID = K.StoreID
  AND LogIn.DeviceTimeStamp = K.DeviceTimeStamp
WHERE (LogIn.[DeviceTimeStamp] > LogOut.[DeviceTimeStamp])
  OR (LogIn.[DeviceTimeStamp] IS NOT NULL AND LogOut.[DeviceTimeStamp] IS NULL)

SQL Fiddle here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14878007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档