用于根据登录计数确定分配用户的主计算机的SQL语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于根据登录计数确定分配用户的主计算机的SQL语句相关的知识,希望对你有一定的参考价值。
我正在尝试使用SQL语句根据登录计数确定指定用户的主计算机。我有数据并试图确定正确的逻辑。
- 用户可以拥有多台计算机,但只有一台主计算机。
- 登录的最大数量成为主要计算机。
- 分配给具有大多数登录的同一用户的Win7和Win10都是主要计算机。
数据:
PreviouslyloggedHistory | LogonCount | ComputerName | OS | AssetAssigned
user1 | 31 | computer1 | W7 | user1
user5 | 1 | computer1 | W7 | user1
user2 | 1 | computer2 | W7 | user2
user2 | 28 | computer2 | W7 | user2
user3 | 1 | computer2 | W7 | user2
user4 | 1 | computer3 | W10 | user2
user5 | 1 | computer3 | W10 | user2
user2 | 3 | computer2 | W7 | user2
user5 | 1 | computer4 | W10 | user6
user6 | 1 | computer4 | W10 | user6
user7 | 1 | computer4 | W10 | user6
user6 | 3 | computer5 | W10 | user6
user5 | 1 | computer4 | W10 | user6
user6 | 1 | computer4 | W10 | user6
user7 | 1 | computer4 | W10 | user6
user5 | 1 | computer4 | W10 | user6
user6 | 22 | computer6 | W7 | user6
user6 | 1 | computer5 | W10 | user6
user6 | 1 | computer4 | W10 | user6
user7 | 1 | computer4 | W10 | user6
user6 | 7 | computer5 | W10 | user6
这是我试过的一个查询。我仍然得到很多结果,其中机器被标记为主机,超过1台相同操作系统的机器。我无法弄清楚如何从同一计算机名的查询中筛选出低登录计数。
select *,
CASE
WHEN [PreviouslyloggedHistory] = [AssetAssigned] THEN 'Primary'
WHEN [PreviouslyloggedHistory] != [AssetAssigned] THEN 'Secondary'
ELSE 'Unknown'
End 'TagIt'
FROM TABLE
ORDER BY [AssetAssigned] DESC
答案
根据我之前的回答,您更改的规格表明您并不确切知道您的结果。这通常是错误查询的原因,这就是为什么我们总是要求请求中的示例结果。它本来可以帮助我们,它也可能首先帮助你。
你说你想保留原始行,你想找到每个用户最大的二手计算机,如果有两台这样的计算机具有相同的操作系统,我们必须随意选择一个。现在看来你似乎不想保留原始行,而只是每个用户和计算机显示一行,并将每个用户操作系统的一台计算机标记为主要行。这要简单得多。
按用户,计算机(及其操作系统)分组以获取计数。将每个用户和操作系统的这些结果编号为登录,以获得该对的一台主计算机。
select
asset_user, computername, os, sum(logoncount) as total_logins,
case when row_number() over (partition by asset_user, os
order by sum(logoncount) desc, computername) = 1
then 'primary'
else 'secondary'
end as priority
from mytable
where login_user = asset_user
group by asset_user, computername, os
order by asset_user, priority, os, computername;
结果:
+------------+--------------+-----+--------------+-----------+ | asset_user | computername | os | total_logins | priority | +------------+--------------+-----+--------------+-----------+ | user1 | computer1 | W7 | 31 | primary | | user2 | computer2 | W7 | 32 | primary | | user6 | computer5 | W10 | 11 | primary | | user6 | computer6 | W7 | 22 | primary | | user6 | computer4 | W10 | 3 | secondary | +------------+--------------+-----+--------------+-----------+
但是:Kua zxsw指出
另一答案
由于您希望保留行,我们使用分析函数来聚合用户的行。
脚步:
- 应用https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8ab619f88b8e1adfff81e3d18e0446fe子句仅查看登录自己计算机的用户。
- 为每个用户和计算机添加计数,以查看用户登录该计算机的频率。
- 与每个用户的最大计数进行比较以标记主计算机
- 另外,对每个用户和操作系统的行进行排名,以便每个操作系统只挑选一台计算机作为主计
查询:
WHERE
结果:
+------------+--------------+-----+------------+-----------+ | asset_user | computername | os | logoncount | priority | +------------+--------------+-----+------------+-----------+ | user1 | computer1 | W7 | 31 | primary | | user2 | computer2 | W7 | 1 | primary | | user2 | computer2 | W7 | 28 | primary | | user2 | computer2 | W7 | 3 | primary | | user6 | computer6 | W7 | 22 | primary | | user6 | computer5 | W10 | 7 | secondary | | user6 | computer5 | W10 | 3 | secondary | | user6 | computer5 | W10 | 1 | secondary | | user6 | computer4 | W10 | 1 | secondary | | user6 | computer4 | W10 | 1 | secondary | +------------+--------------+-----+------------+-----------+
但是:Kua zxsw指出
以上是关于用于根据登录计数确定分配用户的主计算机的SQL语句的主要内容,如果未能解决你的问题,请参考以下文章