用于根据登录计数确定分配用户的主计算机的SQL语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于根据登录计数确定分配用户的主计算机的SQL语句相关的知识,希望对你有一定的参考价值。

我正在尝试使用SQL语句根据登录计数确定指定用户的主计算机。我有数据并试图确定正确的逻辑。

  1. 用户可以拥有多台计算机,但只有一台主计算机。
  2. 登录的最大数量成为主要计算机。
  3. 分配给具有大多数登录的同一用户的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指出

另一答案

由于您希望保留行,我们使用分析函数来聚合用户的行。

脚步:

  1. 应用https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8ab619f88b8e1adfff81e3d18e0446fe子句仅查看登录自己计算机的用户。
  2. 为每个用户和计算机添加计数,以查看用户登录该计算机的频率。
  3. 与每个用户的最大计数进行比较以标记主计算机
  4. 另外,对每个用户和操作系统的行进行排名,以便每个操作系统只挑选一台计算机作为主计

查询:

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语句的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2012怎么创建用户

用于计算表中行数的 SQL 查询

SQL语句中的主键和外键

sqlserver 2012 web 创建账号并分配权限

按部门 ID 计数员工并确定员工 ID 最多的两个部门

使用 SQL 和 C# 将表 1 的主键分配为表 2 中的外键