2013-04-25 71 views
0

我有一個代碼,我需要從超過60000個這個列表中抽出400名隨機員工。這是8個不同的工作分組,我需要從每個分組中選擇一定數量的分組。所以在400個隨機樣本中,我需要400個需要由來自8個組中的每個組的特定數字組成。這是到目前爲止的代碼:組中的隨機樣本

SELECT TOP (400) Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,  Email_Address, Job_Group_Code 
FROM dbo.v_TMS_employee_HR 
ORDER BY NEWID() 

IE:400個隨機記錄返回:第1組需要具有45,第2組需要50,第3組需要35,第4組,需要25,第5組需要100 ,第6組需要5,第7組需要70和第8組需要70.

並且每組由1-4個不同的工作代碼組成。

+0

嗯,你爲什麼不使用ORDER BY RAND() – bksi 2013-04-25 19:51:45

+0

的NEWID選擇隨機數據就好了,每個小組需要400個不同的數字。看到編輯上面 – user2119980 2013-04-25 19:53:28

+0

我看着那個帖子它沒有回答我的問題,請參閱我剛剛編輯的編輯 – user2119980 2013-04-25 19:55:44

回答

0

如果它只是8組,你可以有8個獨立查詢(1爲每個組)用自己的TOP號碼,然後UNION它們放在一起。

像這樣的東西(您需要設置正確的記錄數量以獲得每個組和正確的組碼):

SELECT * FROM 
(SELECT TOP (100) Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,  Email_Address, Job_Group_Code 
FROM dbo.v_TMS_employee_HR 
WHERE Job_Group_Code=1 
ORDER BY NEWID()) 
UNION 
................... 
UNION 
................... 
................... 
UNION 
SELECT * FROM (
SELECT TOP (10) Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,  Email_Address, Job_Group_Code 
FROM dbo.v_TMS_employee_HR 
WHERE Job_Group_Code=8 
ORDER BY NEWID()) 

既然你澄清,有幾個job_group_codes一組在您需要改爲使用WHERE Job_Group_Code IN (1,2,3)

+0

好的,我會嘗試一次,我得到的具體數字,謝謝。 – user2119980 2013-04-25 20:02:29

0

如果你只有8個團體,它是一次性的事情,請嘗試@PM 77-1建議。但是,我會使用UNION ALL而不是UNION

如果您有更多的團體或從每個組中的記錄是不同的號碼,您可以嘗試以下方法

DECLARE @GroupSelect TABLE (Job_Group_Code INT, NumberOfRecord INT) 

INSERT INTO @GroupSelect VALUES (1 ,45), (2 ,50) , .... -- List all your group and number of records your want select from them 

;WITH tbl AS (
SELECT Business_Unit, GEMSID, First_Name, Last_Name, Region, District, Job_Function,  Email_Address, Job_Group_Code 
    , ROW_NUMBER() OVER (PARTITION BY Job_Group_Code ORDER BY NEWID()) as RowNo 
FROM dbo.v_TMS_employee_HR 
) 
, numbers ( 
-- if you don't have number table, you may use this. 
select number + 1 as number from master..spt_values WHERE type = 'P' 
) 
SELECT t.* 
from tbl t 
INNER JOIN @GroupSelect sg 
    ON sg.Job_Group_Code = t.Job_Group_Code 
INNER JOIN numbers n 
    ON sg.NumberOfRecord >= n.number 
WHERE n.number = t.RowNo 
+0

我真的不明白'UNION ALL'的必要性,因爲不同的查詢會產生不同'Job_Group_Code'值的結果。 – 2013-04-25 22:04:35

+0

@ PM77-1,是的,結果是一樣的。但是,出於性能原因,我只會在必要時才使用UNION。 http://stackoverflow.com/questions/3627946/performance-of-union-versus-union-all – EricZ 2013-04-26 00:59:57