Равным образом разделить набор результатов на группы, с курсором или нет? - PullRequest
1 голос
/ 25 февраля 2010

Я строю систему администрирования гонки, с гонщиками и гонками.

Мне нужно разделить, скажем, 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 ]

7 голосов
/ 25 февраля 2010
SELECT  *,
        NTILE((SELECT CAST(CEILING(COUNT(*) / 6.00) AS INT) FROM drivers)) OVER (ORDER BY id) AS heat
FROM    drivers
0 голосов
/ 25 февраля 2010

Редактировать: NTILE-версия Quassnoi намного приятнее.

Вы должны быть в состоянии сделать это, используя цикл while вместо курсора.

Предположим, вы создали таблицу «Race» со столбцами DriverId и GroupNumber (HeatNumber). Вы говорите, что знаете, как рассчитать, сколько групп и сколько драйверов поместить в каждую группу. Таким образом, у вас может быть такой цикл:

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)
...