我有一个代码,我需要从这个超过60,000的列表中提取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 :(得分:0)
如果只有8个组,您可以使用自己的TOP
号码进行8个单独的查询(每个组1个),然后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)
。
答案 1 :(得分: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