Sql server 2008 在SQL中对均匀分布的项进行分组
考虑一个包含104行的学生表。我需要创建每个小组至少有10名学生的小组。在有104名学生的情况下,如果我迭代每个学生并创建分组,我最终会有10组10名学生和1组4名学生。有一条规则,一个有剩余学生的小组不能少于5名学生。在这种情况下,最后一个小组由4名学生组成。我正在尝试两种可能的方法: 将少于5名学生的最后一组集合起来,并将每个学生分配到任何组,或 将最后一组均匀分布到任意组。 我如何实现这些目标?非常感谢Sql server 2008 在SQL中对均匀分布的项进行分组,sql-server-2008,tsql,data-structures,Sql Server 2008,Tsql,Data Structures,考虑一个包含104行的学生表。我需要创建每个小组至少有10名学生的小组。在有104名学生的情况下,如果我迭代每个学生并创建分组,我最终会有10组10名学生和1组4名学生。有一条规则,一个有剩余学生的小组不能少于5名学生。在这种情况下,最后一个小组由4名学生组成。我正在尝试两种可能的方法: 将少于5名学生的最后一组集合起来,并将每个学生分配到任何组,或 将最后一组均匀分布到任意组。 我如何实现这些目标?非常感谢 Eric这是一个变体2。第一部分准备计数器。由于我没有关于学生的任何数据,我决定创建一
Eric这是一个变体2。第一部分准备计数器。由于我没有关于学生的任何数据,我决定创建一个临时表,其中包含@maxStudents行,只有一个列ID 首先,cte学生生成maxStudents行的学生列表。第二个s提取学生,为他们分配行号在这里显然不是必需的,但在插入检索学生的查询时是必需的。它还返回学生人数 第三部分将学生分成小组。如果属于最后一组且成员少于@minGroupSize,则属于最后一组的学生将被重新定位到另一组。版本一可以通过将案例陈述中的零件替换为示例1来实现,将它们放在第一组中
declare @group_size int
set @group_size = 10
declare @maxStudents int
set @maxStudents = 104
declare @minGroupSize int
set @minGroupSize = 5
;with students as (
select 1 id
union all
select 2 * id + b
from students cross join (select 0 b union all select 1) b
where 2 * id + b <= @maxStudents
),
s as (
select students.id, row_number() over(order by students.id) - 1 rowNumber, count (*) over () TotalStudents
from students
)
select s.id StudentID,
case when TotalStudents % @group_size < @minGroupSize
and rowNumber >= (TotalStudents / @group_size * @group_size)
then rowNumber - (TotalStudents / @group_size * @group_size)
else rowNumber / @group_size
end + 1 Group_number
from s
order by 2, 1
你可以用
将有序分区中的行分配到指定的数目
一组一组。分组编号,从一开始。每行,
返回行所属组的编号
一些示例代码:
declare @NumberOfStudents int
declare @StudentsPerGroup int
set @StudentsPerGroup = 10
set @NumberOfStudents = 104
select StudentID,
ntile(@NumberOfStudents / @StudentsPerGroup) over(order by StudentID) as GroupID
from Students
试一试。不幸的是,根据要求,这将无法正常工作。此外,还存在一个限制,即一个小组的学生人数不能少于5人。同样,对于一百名学生,将有十一个小组。@NikolaMarkovinović-要求任何小组的学生不得超过10人,也不得少于5人。这将平均创建11个小组,有些小组10名学生,有些小组9名学生。我理解这个问题,这应该是他想要的。我搞错了。我原以为他想创建十人一组,并平均分配剩余的,但这只是我的想象。谢谢大家。实际上尼古拉是对的。这是我的错。我应该说得更清楚些。谢谢你的帮助我在'ntile@NumberOfStudents/@StudentsPerGroup+1'我得到了我所需要的。可以在这个案例中使用ntile吗?