1

ドライバーとレースヒートを含むレース管理システムを構築しています。

たとえば、13 人のドライバーをグループごとに最大 6 人のグループに分割する必要があります。結果が 2.2 グループになるので不可能です。これは不可能です。3 グループが必要です。6 よりも小さいグループが許可されているため、13 を 3 で割って次の分割を行うことにしました。

ヒート 1: 4 人のドライバー
ヒート 2: 4 人のドライバー
ヒート 3: 5 人のドライバー (残りのドライバーは 6 人以下)

行を分割し、結果を丸めるなどして、3 つのグループが必要であり、グループごとに 4 人以上のドライバーが許可されていることを確認しました。トリッキーな部分は、これをループして残りの (5) を最後のループに追加する方法です... 最初に 2 つの「上位 4 を選択...」、および「上位 100% を選択...」を考えています。 " 残りの 5 人のドライバー。

私はカーソルを知っていますが、私は専門家ではなく、動的 SQL クエリを作成して実行する方法を知っています。

これは、SQL Server 2005 でカーソルやカウンターを使用してどのように行うことができますか?

4

2 に答える 2

7
SELECT  *,
        NTILE((SELECT CAST(CEILING(COUNT(*) / 6.00) AS INT) FROM drivers)) OVER (ORDER BY id) AS heat
FROM    drivers
于 2010-02-25T13:50:54.953 に答える
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)
于 2010-02-25T13:48:43.693 に答える