我正在建立一个种族管理系统,有司机和种族加热。
我需要将13个驱动程序划分为每组最多6个组。这是不可能的,因为结果将是2.2组,这是不可能的,需要3组。允许小于6的小组,因此我决定将13除以3来完成以下任务:
加热1:4车手
加热2:4车手
加热3:5车手(其余车手,但不超过6名)
我已设法划分行并舍入结果等,以便知道需要3组,每组不少于4个驱动程序。棘手的部分是如何遍历这个并在最后一个循环中添加其余的(5)...我正在考虑“SELECT TOP 4 ...”为两个首先,并且“SELECT TOP 100%... “对于剩下的五名车手。
我知道游标,但我不是专家,我知道如何创建和执行动态SQL查询。
如何通过在SQL Server 2005中使用游标和/或计数器来完成这项工作?
答案 0 :(得分:7)
SELECT *,
NTILE((SELECT CAST(CEILING(COUNT(*) / 6.00) AS INT) FROM drivers)) OVER (ORDER BY id) AS heat
FROM drivers
答案 1 :(得分:0)
编辑:Quassnoi的NTILE版本更好。
您应该可以使用while循环而不是游标来执行此操作。
假设您使用列DriverId和GroupNumber(HeatNumber)创建表“Race”。你说你知道如何计算每组中有多少组和多少个驱动程序。所以你可以像这样循环:
set @group = 1
while @group < @totalGroups
begin
insert Race (DriverId, GroupNumber)
select top (@driversPerGroup) d.DriverId, @group
from Drivers d
where not exists(select * from Race r where r.DriverId = d.DriverId)
order by whatever
set @group = @group + 1
end
--insert last group here
insert Race (DriverId, GroupNumber)
select d.DriverId, @totalGroups
from Drivers d
where not exists(select * from Race r where r.DriverId = d.DriverId)