Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Sql server 2008 在SQL中对均匀分布的项进行分组_Sql Server 2008_Tsql_Data Structures - Fatal编程技术网

Sql server 2008 在SQL中对均匀分布的项进行分组

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。第一部分准备计数器。由于我没有关于学生的任何数据,我决定创建一

考虑一个包含104行的学生表。我需要创建每个小组至少有10名学生的小组。在有104名学生的情况下,如果我迭代每个学生并创建分组,我最终会有10组10名学生和1组4名学生。有一条规则,一个有剩余学生的小组不能少于5名学生。在这种情况下,最后一个小组由4名学生组成。我正在尝试两种可能的方法:

将少于5名学生的最后一组集合起来,并将每个学生分配到任何组,或 将最后一组均匀分布到任意组。 我如何实现这些目标?非常感谢


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吗?