通过machineid查找最活跃或最新的用户ID

时间:2019-06-20 22:12:24

标签: sql count grouping

我有一个带有MachineID,UserID和Date列的表。每天我都会在该表中插入/追加一条记录,以记录哪些用户登录到哪台计算机,因此最终获得每天登录到计算机的用户的历史日志。我需要能够从中提取出计算机的最活跃用户(相对于MachineID,具有最多行的UserID),或者如果两个用户并列为“第一名”,那么这两个用户中的最新用户

我正在运行SQL 2012 Express。基本上,我已经有了MachineID和UserID以及它们的每种组合的日期/行数,但我不知道该如何做进一步。

使用以下示例数据集:

[MachineID] [UserID] [Date]
1   1   20190619
1   1   20190620
1   2   20190621
2   3   20190618
2   3   20190619
2   4   20190620
2   4   20190621

我已经运行了SQL:

SELECT DISTINCT MachineID
    , UserID
    , COUNT(DTAdded) as [Logon Count]
FROM MUHistory
GROUP BY MachineID, UserID

结果是:

[MachineID] [UserID]    [Logon Count]
1   1   2
1   2   1
2   3   2
2   4   2

但是我想要的结果是:

[MachineID] [UserID]
1   1
2   4

在MachineID'1'上,用户'1'的登录次数超过其他任何用户,在MachineID'2'上,用户ID'3'和'4'的登录次数相同,但是其中用户ID“ 4”具有最新的登录名。

谢谢,我已经进行了搜索,但是我只能找到有关获得一个或另一个结果(最活跃或最新)但不能将两者结合的帖子。

1 个答案:

答案 0 :(得分:0)

尝试此操作,我首先使用count(*)查找每个用户登录到计算机的次数,然后使用此次数按计数和日期对行顺序进行排序,以选择最新的一种情况(如果有)一条领带。

with a as 
  (     
Select 1 MachineID,  1 UserID,  20190619 Date union all
Select 1 ,  1  , 20190620 union all
Select 1 ,  2  , 20190621 union all
Select 2 ,  3  , 20190618 union all
Select 2 ,  3  , 20190619 union all
Select 2 ,  4  , 20190620 union all
Select 2 ,  4  , 20190621
)
, b as 
(
Select MachineID,UserID, date,
count(*) over (partition by MachineID,UserID order by date asc) cnt
from a
)
,c as 
(
select *
,row_number() Over(partition by MachineID order by cnt desc,date desc) fn
from b
) 
Select MachineID,UserID,date
from c
where fn=1;

o / p:

MachineID   UserID  date
 1          1      20190620
 2         4       20190621