如何 SELECT COUNT DISTINCT 为 MAX 的行?
How to SELECT lines where COUNT DISTINCT is MAX?
这可能是一个简单的问题,但基本上我想 SELECT 只获取 SQL 服务器中实验中出现次数最多的行。
我有一个生成以下数据的查询:
SELECT [JOB ROLE], [CITY], COUNT(DISTINCT([EMPLOYEE_ID])) as [COUNT]
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
我想达到以下结果 SELECT 只有 EMPLOYEE_ID 的 COUNT DISTINCT 是 MAX 的行:
非常感谢您提供的友好帮助和关于如何以最简单的方式到达此处的建议!
您可以使用 TOP WITH TIES
和 RANK()
:
SELECT TOP (1) WITH TIES [JOB ROLE], [CITY], COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT]
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
ORDER BY RANK() OVER (ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC;
或者,使用子查询和 RANK()
:
SELECT [JOB ROLE], [CITY], [COUNT]
FROM (SELECT [JOB ROLE], [CITY],
COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT],
RANK() OVER (ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC) as seqnum
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
) jc
WHERE seqnum = 1;
编辑:
问题似乎已更改为每个城市最常见的工作角色。上面的查询很容易修改:
SELECT TOP (1) WITH TIES [JOB ROLE], [CITY], COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT]
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
ORDER BY RANK() OVER (PARTITION BY [JOB ROLE] ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC;
或者,使用子查询和 RANK()
:
SELECT [JOB ROLE], [CITY], [COUNT]
FROM (SELECT [JOB ROLE], [CITY],
COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT],
RANK() OVER (PARTITION BY [JOB ROLE], ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC) as seqnum
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
) jc
WHERE seqnum = 1;
如果你不关心关系,你可以使用 FIRST_VALUE() window 函数:
SELECT DISTINCT [JOB ROLE],
FIRST_VALUE([CITY]) OVER (PARTITION BY [JOB ROLE] ORDER BY COUNT(DISTINCT([EMPLOYEE_ID])) DESC)
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
这可能是一个简单的问题,但基本上我想 SELECT 只获取 SQL 服务器中实验中出现次数最多的行。 我有一个生成以下数据的查询:
SELECT [JOB ROLE], [CITY], COUNT(DISTINCT([EMPLOYEE_ID])) as [COUNT]
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
我想达到以下结果 SELECT 只有 EMPLOYEE_ID 的 COUNT DISTINCT 是 MAX 的行:
非常感谢您提供的友好帮助和关于如何以最简单的方式到达此处的建议!
您可以使用 TOP WITH TIES
和 RANK()
:
SELECT TOP (1) WITH TIES [JOB ROLE], [CITY], COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT]
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
ORDER BY RANK() OVER (ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC;
或者,使用子查询和 RANK()
:
SELECT [JOB ROLE], [CITY], [COUNT]
FROM (SELECT [JOB ROLE], [CITY],
COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT],
RANK() OVER (ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC) as seqnum
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
) jc
WHERE seqnum = 1;
编辑:
问题似乎已更改为每个城市最常见的工作角色。上面的查询很容易修改:
SELECT TOP (1) WITH TIES [JOB ROLE], [CITY], COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT]
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
ORDER BY RANK() OVER (PARTITION BY [JOB ROLE] ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC;
或者,使用子查询和 RANK()
:
SELECT [JOB ROLE], [CITY], [COUNT]
FROM (SELECT [JOB ROLE], [CITY],
COUNT(DISTINCT [EMPLOYEE_ID]) as [COUNT],
RANK() OVER (PARTITION BY [JOB ROLE], ORDER BY COUNT(DISTINCT [EMPLOYEE_ID]) DESC) as seqnum
FROM MyTable
GROUP BY [JOB ROLE], [CITY]
) jc
WHERE seqnum = 1;
如果你不关心关系,你可以使用 FIRST_VALUE() window 函数:
SELECT DISTINCT [JOB ROLE],
FIRST_VALUE([CITY]) OVER (PARTITION BY [JOB ROLE] ORDER BY COUNT(DISTINCT([EMPLOYEE_ID])) DESC)
FROM MyTable
GROUP BY [JOB ROLE], [CITY]