在论坛中出现的比较难的sql问题:23(随机填充问题)

本文深入探讨了SQL中随机数据抽取及如何将这些数据平均分配到另一个表中的方法。包括如何从一个表中随机选择指定数量的记录,并将其与另一个表进行关联操作,最终展示了一个高效且快速的随机数据处理过程。

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。


1、一段SQL的写法,求方法!

http://bbs.youkuaiyun.com/topics/390705441


select * from k11  有10條紀錄

files1  files2  files3  files4
AA        BB     CC       DD
ZZ        EE     TT       YY
NN        MM     GG       UU

另外一个表User 有99条记录,现在要随机在User这个表里面随机选3条记录
select top 3 NewID() as random,[UserId] from [User]
random          UserId
E81A4DBBming
F31B3B6Cling
16574317Ting

将User这个表上的UserId值结果平均分配到k11上面那个表上,最后結果顯示如下

files1  files2  files3  files4  UserId
A1        BB     CC       DD     ming
A2        EE     TT       YY     ling
A3        MM     GG       UU     ling
A4        XX     XX       XX     ming
A5        XX     XX       XX     ling
A6        XX     XX       XX     Ting
A7        XX     XX       XX     ming
A8        XX     XX       XX     ling
A9        XX     XX       XX     ling
A10       XX     XX       XX     ming


sql代码:

 

create table k11(
files1 varchar(10),  
files2 varchar(10), 
files3 varchar(10), 
files4 varchar(10), 
UserId varchar(10))

insert into k11
select 'A1',        'BB',     'CC',      'DD',     'ming' union all
select 'A2',        'EE',     'TT',       'YY',     'ling' union all
select 'A3',        'MM',     'GG',       'UU',     'Ting' union all
select 'A4',        'XX',     'XX',       'XX',     'ming' union all
select 'A5',        'XX',     'XX',       'XX',     'ling' union all
select 'A6',        'XX',     'XX',      'XX',     'Ting' union all
select 'A7',        'XX',     'XX',      'XX',     'ming' union all
select 'A8',        'XX',     'XX',       'XX',     'ling' union all
select 'A9',        'XX',     'XX',       'XX',     'Ting' union all
select 'A10',       'XX',     'XX',       'XX',     'ming'


create table [user]
(
UserId varchar(10)
)

insert into [user]
select 'ming' union all
select 'ling' union all
select 'Ting'
go


;with t
as
(
select [UserId],
       ROW_NUMBER() over(order by newid()) as rownum
from [User]
),

tt
as
(
select *,
       case when rownum1 %3 =0 then 3 else rownum1 %3 end as rownum
from 
(
	select *,
		   ROW_NUMBER() over(order by getdate()) as rownum1
	from k11
)a
)

select tt.files1,tt.files2,tt.files3,tt.files4,t.UserId
from tt
left join t
        on tt.rownum = t.rownum
           and t.rownum <=3
/*
files1	files2	files3	files4	UserId
A1	BB	CC	DD	ming
A2	EE	TT	YY	ling
A3	MM	GG	UU	Ting
A4	XX	XX	XX	ming
A5	XX	XX	XX	ling
A6	XX	XX	XX	Ting
A7	XX	XX	XX	ming
A8	XX	XX	XX	ling
A9	XX	XX	XX	Ting
A10	XX	XX	XX	ming
*/

 

2、随机返回100条数据:

如果表比较大,有上千万的数据,那么通过如下的代码,可以随机返回100条数据,这里的随机,不是真正意义上的随机,但确实能让人感觉是随机,也就是每次返回的数据都不一样,最关键的是速度非常快,接近于0秒,只消耗了 62毫秒。

 

select *
from 
(
select *,
       ROW_NUMBER() over(order by @@servername) as rownum
from dbo.xxx
)t
where rownum between CHECKSUM(getdate()) % 10000 and CHECKSUM(getdate()) % 10000+99

 


 

SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(100 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 62 毫秒。


 

转载于:https://www.cnblogs.com/momogua/p/8304523.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值