首页 > 解决方案 > 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 记录。

我能做些什么来改善这一点,只得到我的预期结果?

标签: sql-server

解决方案


您走在正确的轨道上,但您应该仅按用户名和部门进行汇总:

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);

推荐阅读