使用窗口函数。以下是使用临时表 #people 的完整解决方案。
-- 使用临时数据库
使用临时数据库;
去
-- 跌落测试表
--drop table #people;
--go
-- 创建测试表
创建表 #people (my_id int, my_gender char(1), my_name varchar(25));
去
--清除测试表
从#people 中删除;
-- 三个计数
插入 #people 价值观
(23, 'M', '亚当'),
(34, 'F', '玫瑰');
去 3
-- 两个计数
插入 #people 价值观
(20, 'M', '最大'),
(15, 'F', '珍妮');
去 2
-- 一个计数
插入 #people 价值观
(20, 'M', '约翰'),
(15, 'F', '朱莉');
去
-- 按性别抢前两名
;
使用 cte_Get_Top_Two 作为
(
选择 ROW_NUMBER() OVER(PARTITION BY my_gender ORDER BY count() DESC) AS my_window,
my_gender, my_name, count() 总计
来自#people
按 my_gender、my_name 分组
)
select * from cte_Get_Top_Two where my_window in (1, 2)
去
这是输出。
PS:您可以从表中删除 my_id,因为它与您的问题无关,但不会更改解决方案。