我有一张桌子:
ComputerID,UserID,LoginDate
我需要一个返回的select语句:
ComputerID,UserID,LoginCount
对于所有计算机,但对于每台计算机,仅显示最常登录到该计算机的一个用户.(如果有一个平局,我想我会想随意选择一个用户......所以这似乎表明我需要一个TOP 1.)
(这是ms访问,因此不能使用供应商特定的功能).
select main.*
from (select ComputerID, UserID, count(1) as cnt
from ComputerLoginHistory
group by ComputerID, UserID) as main
inner join (select ComputerID, max(cnt) As maxCnt
from
(select ComputerID, UserID, count(1) as cnt
from ComputerLoginHistory
group by ComputerID, UserID) as Counts
group by ComputerID)
as maxes
on main.ComputerID = maxes.ComputerID
and main.cnt = maxes.maxCnt
Run Code Online (Sandbox Code Playgroud)
为了处理> 1个用户可能具有相同loginCount的情况,我可以想到围绕此选择另一个选择,选择Max(UserID).....所以你基本上只是任意选择一个他们 这就是我在这个例子中所做的,我将撤回最近的用户,而不是最活跃的用户:
Select ComputerID, Max(xUserID) As UserID, MaxLoginDate
FROM
(
SELECT main.ComputerID, main.UserID as xUserID, main.MaxLoginDate
FROM [select ComputerID, UserID, Max(LoginDate) as MaxLoginDate
from ComputerLoginHistory
group by ComputerID, UserID]. AS main
INNER JOIN [select ComputerID, Max(MaxLoginDate) As MaxLogin
from
(select ComputerID, UserID, Max(LoginDate) as MaxLoginDate
from ComputerLoginHistory
group by ComputerID, UserID) as Counts
group by ComputerID]. AS maxes ON (main.MaxLoginDate = maxes.MaxLogin) AND (main.ComputerID = maxes.ComputerID)
)
GROUP BY ComputerID, MaxLoginDate
ORDER BY ComputerID
Run Code Online (Sandbox Code Playgroud)
在MS Access中,我会写两个三个查询并从第一个查询调用第二个查询.第一个查询应该只进行计数,下一个查询将找到第一个查询的最大值.在将前两个查询一起加入后,第三个查询将引用第一个查询中的用户ID.
例如:
qryCountQuery:
SELECT
LoginCount.ComputerID,
LoginCount.UserID,
Count(LoginCount.ComputerID) AS CountOfComputerID
FROM
LoginCount
GROUP BY
LoginCount.ComputerID, LoginCount.UserID;
Run Code Online (Sandbox Code Playgroud)
qryMaxQuery:
SELECT
qryCountQuery.ComputerID,
Max(qryCountQuery.CountOfComputerID) AS MaxOfCountOfComputerID
FROM
qryCountQuery
GROUP BY
qryCountQuery.ComputerID;
Run Code Online (Sandbox Code Playgroud)
qryCountMaxQueryCombined:
SELECT
qryMaxQuery.ComputerID,
qryMaxQuery.MaxOfCountOfComputerID,
qryCountQuery.UserID
FROM
qryCountQuery
INNER JOIN qryMaxQuery
ON (qryCountQuery.CountOfComputerID = qryMaxQuery.MaxOfCountOfComputerID) AND
(qryCountQuery.ComputerID = qryMaxQuery.ComputerID);
Run Code Online (Sandbox Code Playgroud)
注意:如果您的用户与大多数登录到一台PC"绑定",则PC将同时显示两个用户.您可以在另一个查询中UNIQUE抛出或抛出FIRST聚合调用.这取决于你是否绝对必须只有一个结果computerID.
注意2:在MySQL等其他系统中,我可能会使用嵌套查询,但我更喜欢在Access中将其分开.
注3:我在Access中忘记了这个问题很难.我很高兴我测试了我的代码.
如果您想要每个计算机ID与其顶级用户的列表,它将类似于:
select main.*
from (select ComputerID, UserID, count(1) as cnt
from logTable
group by ComputerID, UserID) as main
inner join (select ComputerID, max(cnt) maxCnt
from (select ComputerID, UserID, count(1) as cnt
from logTable
group by ComputerID, UserID) as Counts)
as maxes
on main.ComputerID = maxes.ComputerID
and main.cnt = maxes.maxCnt
Run Code Online (Sandbox Code Playgroud)