2010-02-25 28 views
1

我建立一個競賽管理體制,與司機和比賽預賽。將結果集等分成組,用光標還是不用?

我需要來劃分,可以說,13個驅動到最大6組,每組。這是不可能的,因爲結果將是2.2組,這是不可能的,需要3組。更小的組比6是允許的,所以我決定除以3 13來完成follwing劃分:

熱1:4驅動
熱2:4級的驅動
熱3:5驅動器(剩餘的驅動程序,但不超過6)

我已成功地劃分的行和舍入的結果等來知道3個基團是必要和每組不低於4個驅動程序是允許的。棘手的部分是如何循環播放,並在最後一個循環中添加其餘的(5)...我首先想到了「SELECT TOP 4 ...」,並且「SELECT TOP 100%...」 「其餘五位車手。

我知道遊標,但我不是專家,我知道如何創建和執行動態SQL查詢。

怎麼可以這樣利用光標和/或計數器在SQL Server 2005做什麼?

回答

7
SELECT *, 
     NTILE((SELECT CAST(CEILING(COUNT(*)/6.00) AS INT) FROM drivers)) OVER (ORDER BY id) AS heat 
FROM drivers 
+0

+1,我第一次見過NTILE! – 2010-02-25 14:41:23

+0

不錯! NTILE事情順利解決了我的問題:-)謝謝! – henrico 2010-02-25 15:25:08

+0

@henrico:別忘了接受答案吧! :) – Quassnoi 2010-02-25 15:28:12

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) 
+0

感謝您的回覆,該NTILE事情解決我的問題。 – henrico 2010-02-25 15:34:44