sql-server - MS-SQL 查询以显示重复项列表中的最大值
问题描述
场景是我有一个访问表,其中包含用于用户访问的数据行,它还包含一个访问级别,该级别具有 1 或 2。1 表示“用户”,2 表示“管理员”。问题在于,用户可以同时包含这两个值(访问源来自提供给该表的各种其他系统)。
因此,我的问题是,如何编写一个返回用户列表及其访问级别的查询,它只显示用户对给定部门的最大值?
Username | Department | AccessLevel
---------------------------------------------
John Smith | IT | 1
John Smith | IT | 2
John Smith | Security | 2
Sally Harris | Security | 1
Craig Larry | IT | 1
如您所见,该表包含来自 John Smith 的两条记录,第二条具有更高的访问级别。
我想要的结果是
John Smith | IT | 2
John Smith | Security | 2
Sally Harris | Security | 1
Craig Larry | IT | 1
这是我尝试过的:
Select DISTINCT(Username), Department, MAX(AccessLevel )
From departmentaccess
Group By Username, Department, AccessLevel
我得到的结果与表中的完全一样。我相信我正在尝试的这个查询会返回完全重复的行的 Max 记录。
我能做些什么来改善这一点,只得到我的预期结果?
解决方案
您走在正确的轨道上,但您应该仅按用户名和部门进行汇总:
SELECT Username, Department, MAX(AccessLevel)
FROM departmentaccess
GROUP BY Username, Department;
如果表中有更多列未出现在GROUP BY
子句中,则更通用的查询将是:
SELECT TOP 1 WITH TIES Username, Department, AccessLevel, other_column
FROM departmentaccess
ORDER BY ROW_NUMBER() OVER (PARTITION BY Username, Department ORDER BY AccessLevel DESC);
推荐阅读
- flutter - Revenuecat、Flutter - PurchasePackage 不起作用,但没有例外
- xaml - 我需要使用带有输入的ffimageloading:AdvancedEntry
- r - 使用 for 循环在 R 中创建多个具有不同名称的对象时出错
- ios - 如何在不覆盖以前数据的情况下使用 rxSwift 压缩、合并或连接?
- flutter - 该表达式不计算为函数,所以它不能被调用?
- javascript - 函数接收一个字符数组并返回一个包含字符 az、AZ 和 0-9 的字符串
- jsf - 为什么页面第一次加载时没有连接到数据库?
- java - 如何将单个任务变成并行线程
- java - 在 JavaFX 表格视图中显示 SQL Server 数据
- javascript - 使用 JavaScript 将 polyfill 动态加载到 IE