2013-04-25 3 views
0

У меня есть код, где мне нужно вытащить 400 случайных сотрудников из этого списка из более чем 60 000. Существуют 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() 

И.Е.: Из 400 случайных записей, возвращаемых: Группа 1 должна иметь 45, Группа 2 нуждается в 50, Группа 3 нуждается в 35, группы 4, нуждается в 25, Группа 5 нуждается в 100 , Группа 6 нуждается в 5, потребности Группы 7 70 и Группы 8 70.

И каждая группа состоит из 1-4 различных кодов работы.

+0

Hm, почему бы вам не использовать ORDER BY RAND() – bksi

+0

NEWID выбирает случайные данные просто прекрасны, из них 400 каждая группа должна иметь другое число. СМОТРЕТЬ РЕДАКТИКИ ВЫШЕ – user2119980

+0

Я посмотрел на этот пост, он не ответил на мой вопрос, см. Редактирование, которое я только что сделал – user2119980

ответ

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

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'. –

+0

@ PM77-1, да, это тот же результат. Однако, по соображениям производительности, я бы использовал UNION только в случае необходимости. http://stackoverflow.com/questions/3627946/performance-of-union-versus-union-all – EricZ