【发布时间】:2009-12-11 17:38:05
【问题描述】:
我有一张桌子:
计算机 ID、用户 ID、登录日期
我需要一个返回的 select 语句:
ComputerID、UserID、LoginCount
对于所有台计算机,但对于每台计算机,只显示最常登录该计算机的一个用户。 (如果有平局,我想我只想随意选择一个用户....所以这似乎表明我在某个地方需要一个 TOP 1。)
(这是在 ms-access 中,因此不能使用供应商特定的功能)。
解决方案(JBrooks 回答的轻微修复)
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
为了处理 >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
【问题讨论】:
-
以及LoginCount数相同的用户数少时怎么办
-
我用一个例子编辑了我的答案。我用访问数据库中的一些示例数据对其进行了测试,它对我有用。