如何根据最大计数选择一行?(使用标准sql)

tbo*_*one 5 sql ms-access

我有一张桌子:

ComputerID,UserID,LoginDate

我需要一个返回的select语句:
ComputerID,UserID,LoginCount

对于所有计算机,但对于每台计算机,显示最常登录到该计算机的一个用户.(如果有一个平局,我想我会想随意选择一个用户......所以这似乎表明我需要一个TOP 1.)

(这是ms访问,因此不能使用供应商特定的功能).

解决方案(轻微修复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
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)

Ben*_*ack 5

在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中忘记了这个问题很难.我很高兴我测试了我的代码.


JBr*_*oks 5

如果您想要每个计算机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)