22,209
社区成员
发帖
与我相关
我的任务
分享
-- 两个参数,例子减小了规模
DECLARE @max_number int -- 总数
DECLARE @group_size int -- 分组大小
SET @max_number = 100
SET @group_size = 10
-- 测试数据
DECLARE @A TABLE(number int)
DECLARE @B TABLE(number int)
INSERT INTO @A
SELECT number
FROM master..spt_values
WHERE type = 'p'
AND number BETWEEN 1 AND @max_number
INSERT INTO @B
SELECT TOP 7 number
FROM master..spt_values
WHERE type = 'p'
AND number BETWEEN 1 AND @max_number
ORDER BY NEWID()
SELECT * FROM @b ORDER BY number
-- 把下面INSERT前的注释去掉就是你要的语句
;WITH t1 AS (
SELECT number - 1 AS group_no
FROM master..spt_values
WHERE type = 'p'
AND number BETWEEN 1 AND (@max_number/@group_size)
)
,t2 AS (
SELECT (a.number - 1)/@group_size AS group_no,
a.number
FROM @A a
WHERE NOT EXISTS (SELECT *
FROM @B b
WHERE b.number = a.number)
)
--INSERT INTO @B (NUMBER)
SELECT tb.number
FROM t1
CROSS APPLY (
SELECT TOP 1 *
FROM t2
WHERE t2.group_no = t1.group_no
ORDER BY NEWID()
) tb
ORDER BY tb.number
number
-----------
21
22
25
33
34
43
54
number
-----------
6
11
23
37
50
51
62
71
83
97
with table1 as --生成1000000连续数
(
select a.number*1000+b.number+1 allnum from
(select * from master..spt_values where type='P' and number<1000)a,
(select * from master..spt_values where type='P' and number<1000)b
)
, table2 as --随机生成近50000条记录
(
select distinct round(rand(checksum(newid()))*1000000,0) sumenum from
(select * from master..spt_values where type='P' and number<50)a,
(select * from master..spt_values where type='P' and number<1000)b
)
select * from (
select allnum
, ROW_NUMBER() over(partition by round((allnum-1)/500, 0) order by rand(checksum(newid()))) rn
from table1
where allnum not in (select sumenum from table2)
) aa
where rn=1
order by allnum