同样将结果集分成组,光标与否?

时间:2010-02-25 13:32:27

标签: sql sql-server cursors

我正在建立一个种族管理系统,有司机和种族加热。

我需要将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中使用游标和/或计数器来完成这项工作?

2 个答案:

答案 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)