Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 为每个类别中的每n个记录分配新组_Tsql - Fatal编程技术网

Tsql 为每个类别中的每n个记录分配新组

Tsql 为每个类别中的每n个记录分配新组,tsql,Tsql,我需要为每个类别中的每n个记录创建组。例如,我有一个包含StdId、Gender和Subject的学生表,现在我想将所有学生按性别和科目分组,每组不能超过两个 下面是示例数据的代码 declare @Students table (StdId int, Gender char(1), Subj varchar(10)) insert into @students select 1, 'F', 'Math' insert into @students select 2, 'M', 'Math'

我需要为每个类别中的每n个记录创建组。例如,我有一个包含StdId、Gender和Subject的学生表,现在我想将所有学生按性别和科目分组,每组不能超过两个

下面是示例数据的代码

declare @Students table (StdId int, Gender char(1), Subj varchar(10))

insert into @students select 1, 'F', 'Math'
insert into @students select 2, 'M', 'Math'
insert into @students select 3, 'M', 'Math'
insert into @students select 4, 'F', 'Math'
insert into @students select 5, 'F', 'Math'
insert into @students select 6, 'F', 'History'
insert into @students select 7, 'M', 'History'
insert into @students select 8, 'F', 'English'
insert into @students select 9, 'F', 'English'
insert into @students select 10, 'M', 'English'
insert into @students select 11, 'F', 'English'
insert into @students select 12, 'M', 'English'
我需要这样的输出:

GroupNo Subj    Gender  StdId
1   English F   8
1   English F   9
2   English F   11
3   English M   10
3   English M   12
4   History F   6
5   History M   7
6   Math    F   1
6   Math    F   4
7   Math    F   5
8   Math    M   2
8   Math    M   3

Ok在的帮助下找到了我的解决方案


伟大的工作张贴在一个容易复制的格式样本日期!不过,一般来说,最好也向我们展示您尝试过的内容和不适用的内容。否则,我们只是为您做这些工作,您没有机会学习代码。看看我的投票,虽然,包括数据设置和期望的输出。好吧,因为你找到了一个解决方案,我已经删除了我的答案。
;with FirstRank as 
(select DENSE_RANK() over (order by Subj, Gender) as rnk, * from @students),
SecondRank AS
(select (ROW_NUMBER() OVER (PARTITION BY rnk ORDER by gender)-1)
            / 2 as rn,*
    from FirstRank
)
select DENSE_RANK() OVER (ORDER BY rnk,rn) as GrpNo, Subj, Gender, StdId from SecondRank