我有一个带有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”具有最新的登录名。
谢谢,我已经进行了搜索,但是我只能找到有关获得一个或另一个结果(最活跃或最新)但不能将两者结合的帖子。
答案 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