每个类别取出固定个数记录

编程有钱人了 2016-03-22 09:29:34

create table Student --学生成绩表
(
id int, --主键
Grade int, --班级
Gender nvarchar --性别
)
go

insert Student
select 1,1,'女'
union all select 2,1,'女'
union all select 3,1,'男'
union all select 4,1,'男'
union all select 5,1,'男'
union all select 6,2,'女'
union all select 7,2,'女'
union all select 8,2,'男'
union all select 9,2,'男'
union all select 10,2,'男'



现在有2个班级,每个班级5名学生。

要求:
现在要求 每个班级取出3个人,如果这个班级不足3人就取出全部,
如果超过了3人就只取出3人,优先显示女生

结果应该是

序号 班级 性别
1 1 女
2, 1 女
3 1 男
4 2 女
5 2 女
6 2 男

用partition by 应该实现不了这种效果吧
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2016-03-22
  • 打赏
  • 举报
回复

select 序号=row_number() over(order by id),
          班级=Grade,
          性别=Gender
 from (select *,row_number() over(partition by Grade order by Gender desc) 'rn'
           from Student) t
 where rn<=3

/*
序号                   班级          性别
-------------------- ----------- ----
1                    1           女
2                    1           女
3                    1           男
4                    2           女
5                    2           女
6                    2           男

(6 row(s) affected)
*/
唐诗三百首 2016-03-22
  • 打赏
  • 举报
回复
引用 2 楼 wangjun8868 的回复:
如果性别那个字段 是整形的 1代表女 2代表男 SQL语句咋写

select 序号=row_number() over(order by id),
          班级=Grade,
          性别=Gender
 from (select *,row_number() over(partition by Grade order by Gender) 'rn'
           from Student) t
 where rn<=3

/*
序号                   班级          性别
-------------------- ----------- -----------
1                    1           1
2                    1           1
3                    1           2
4                    2           1
5                    2           1
6                    2           2

(6 row(s) affected)
*/
编程有钱人了 2016-03-22
  • 打赏
  • 举报
回复
引用 1 楼 KanzakiOrange 的回复:
SELECT * FROM (
SELECT *,ROW_NUMBER() OVER (PARTITION BY Grade ORDER BY CASE Gender WHEN '女' THEN 0 ELSE 1 END) AS RN
	FROM #Student) a 
		WHERE a.RN <= 3
如果性别那个字段 是整形的 1代表女 2代表男 SQL语句咋写
Ginnnnnnnn 2016-03-22
  • 打赏
  • 举报
回复
引用 2 楼 wangjun8868 的回复:
[quote=引用 1 楼 KanzakiOrange 的回复:]
SELECT * FROM (
SELECT *,ROW_NUMBER() OVER (PARTITION BY Grade ORDER BY CASE Gender WHEN '女' THEN 0 ELSE 1 END) AS RN
	FROM #Student) a 
		WHERE a.RN <= 3
如果性别那个字段 是整形的 1代表女 2代表男 SQL语句咋写[/quote] 你就把哪个'女' 换成 1 就可以了啊
Ginnnnnnnn 2016-03-22
  • 打赏
  • 举报
回复
SELECT * FROM (
SELECT *,ROW_NUMBER() OVER (PARTITION BY Grade ORDER BY CASE Gender WHEN '女' THEN 0 ELSE 1 END) AS RN
	FROM #Student) a 
		WHERE a.RN <= 3

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧