2014-09-15 3 views
0

У меня есть набор данных, в котором мне нужно случайным образом выбрать х строк, удовлетворяющих определенным критериям, х строк, соответствующих другим критериям и т. Д., И выводит результаты в одну таблицу. Я использую следующие:Предотвращение дубликатов со случайными строками и дубликатами

SELECT * FROM (SELECT TOP 1000 * FROM dbo.[Client List] 
WHERE Source = 'HC' AND Service = 'Service1' AND Provider = 'ProviderName1' 
ORDER BY NEWID()) Table1 

UNION ALL 

SELECT * FROM (SELECT TOP 500 * FROM dbo.[Client List] 
WHERE Source = 'HC' AND Service = 'Service2' AND Provider = 'ProviderName2' 
ORDER BY NEWID()) Table2 

UNION ALL 

SELECT * FROM (SELECT TOP 2200 * FROM dbo.[Client List] 
WHERE Source = 'BA' AND Service = 'Service3' AND Provider = 'ProviderName3' 
ORDER BY NEWID()) Table3 

Это работает, но есть одна проблема:... Это позволяет дубликата идентификатора клиента (ПСЭ [Список клиентов] [ClientID], чтобы выбрать Все мои результаты должны быть уникальными клиентами.

Другими словами, он должен выполнить первый случайный выбор, затем выполнить второй случайный выбор, не имея возможности выбрать любой из идентификаторов ClientID, выбранных при первом выборе, и т. д. (Да, я понимаю что это не технически «случайный».) Есть ли способ добавить какой-то код в инструкцию WHERE для каждого последующего SELECT, или мне нужно переосмыслить всю структуру кода? Спасибо!

ответ

0

Как насчет чего-то подобного?

with Service1 as 
(
    SELECT TOP 1000 * 
    FROM dbo.[Client List] 
    WHERE Source = 'HC' 
     AND Service = 'Service1' 
     AND Provider = 'ProviderName1' 
    ORDER BY NEWID() 
) 
, Service2 as 
(
    SELECT TOP 500 * 
    FROM dbo.[Client List] 
    WHERE Source = 'HC' 
     AND Service = 'Service2' 
     AND Provider = 'ProviderName2' 
     AND ClientID not in (select ClientID from Service1) 
    ORDER BY NEWID() 
) 
, Service3 as 
(
    SELECT TOP 2200 * 
    FROM dbo.[Client List] 
    WHERE Source = 'BA' 
     AND Service = 'Service3' 
     AND Provider = 'ProviderName3' 
     AND ClientID not in (select ClientID from Service1) 
     AND ClientID not in (select ClientID from Service2) 
    ORDER BY NEWID() 
) 

select * 
from Service1 

union all 

select * 
from Service2 

union all 

select * 
from Service3