Sql 使用随机行和重复项防止重复

Sql 使用随机行和重复项防止重复,sql,random,random-sample,distinct-values,newid,Sql,Random,Random Sample,Distinct Values,Newid,我有一个数据集,我需要随机选择x个符合特定标准的行数,x个符合其他标准的行数,等等,并在一个表中输出结果。我一直在使用以下方法: 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 (S

我有一个数据集,我需要随机选择x个符合特定标准的行数,x个符合其他标准的行数,等等,并在一个表中输出结果。我一直在使用以下方法:

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
这是可行的,但有一个问题:它允许选择重复的客户端标识符dbo.[client List].[ClientID]。我的所有结果必须是唯一的客户


换句话说,它必须进行第一次随机选择,然后进行第二次随机选择,而不能选择在第一次选择中选择的任何clientid,依此类推。是的,我意识到这在技术上不是随机的。有没有办法在每个后续SELECT的WHERE语句中添加某种代码,或者需要重新考虑代码的整个结构?谢谢

像这样的怎么样

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