关于随机选取数据的解决方案--集思广益!

Benimarunikado 2003-12-15 06:04:00
--需求:
--现在想编制一段可以实现随机选取数据的程序,可以是函数,
--也可以是存储过程,或者其他;
1.执行时,给定一个变量,比如 @count=3(表示需要随机选取出3条记录,依此类推);
2.筛选出的记录不能重复;
3.如果返回记录为0条时,给出提示:"请再次执行程序!"或者其他;

提请讨论,请各位达人不吝赐教!!!
下面是模拟数据环境:

--关于随机选取数据的解决方案(示例):

--建立模拟数据环境:

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO

--提取参与者的主要数据,插入记录到表 T1 中;

CREATE TABLE T1(
[身份证号码] CHAR(20) PRIMARY KEY NOT NULL,
[姓名] CHAR(10) NOT NULL,
)
GO

INSERT T1 SELECT '532923800618008','左某'
UNION ALL SELECT '532920740506001','张某'
UNION ALL SELECT '532924930930002','杨某'
UNION ALL SELECT '532933590515003','赵某'
UNION ALL SELECT '532922900614005','林某'
UNION ALL SELECT '532901850101004','段某'
UNION ALL SELECT '532656880101006','郭某'
UNION ALL SELECT '532922900614007','江某'
UNION ALL SELECT '532920740506011','刘某'
UNION ALL SELECT '532920740506021','陈某'
UNION ALL SELECT '532901850101024','王某'
UNION ALL SELECT '532901850101031','叶某'
UNION ALL SELECT '532656880101002','彭某'
UNION ALL SELECT '532656880101001','李某'
GO

--现在给出模拟数据如下:

SELECT * FROM T1
/*

结果集如下:

身份证号码 姓名
-------------------- ----------
532656880101001 李某
532656880101002 彭某
532656880101006 郭某
532901850101004 段某
532901850101024 王某
532901850101031 叶某
532920740506001 张某
532920740506011 刘某
532920740506021 陈某
532922900614005 林某
532922900614007 江某
532923800618008 左某
532924930930002 杨某
532933590515003 赵某

(所影响的行数为 14 行)

*/

PS:我曾经尝试过用 RAND() 函数,可是还存在一些问题!自己还是菜鸟啊!
...全文
101 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyFor 2003-12-16
  • 打赏
  • 举报
回复
select top 3 * from table order by newid()
azsoft 2003-12-16
  • 打赏
  • 举报
回复
cast((RAND()*10) as int
cloudchen 2003-12-16
  • 打赏
  • 举报
回复
这样,设定一个最小条数、一个最大条数,这样就可以避免0,最大也可以取count(*)
比较方便,不必用动态sql

declare @start int,@end int,@count int
set @start = 1
set @end = 3
select @count = floor((@end-@start+1)*rand()+@start)
set rowcount @count
select * from t1 order by newid()
set rowcount 0
yui 2003-12-16
  • 打赏
  • 举报
回复
数据量大的话,使用ORDER BY NEWID()的方法全部都是失败!!
Benimarunikado 2003-12-15
  • 打赏
  • 举报
回复
谢谢楼上的各位兄弟,明天我测试去!成功后马上分红!
j9988 2003-12-15
  • 打赏
  • 举报
回复
set ROWCOUNT @count
youngby 2003-12-15
  • 打赏
  • 举报
回复
谢谢马可
youngby 2003-12-15
  • 打赏
  • 举报
回复
收到
txlicenhe 2003-12-15
  • 打赏
  • 举报
回复
楼上: 
select top @count ....

这种语句必须用动态SQL才行。
youngby 2003-12-15
  • 打赏
  • 举报
回复
select top @count * from table
where right(身份证号码 ,cast((RAND()*10) as int )= cast(cast((RAND() *10 ) as int) as char)
这个大大的错了。。。

真是丢脸55555


select top @count * from table
where substring(身份证号码 ,cast((RAND()*10) as int),1 )= cast(cast((RAND() *10 ) as int) as char)
txlicenhe 2003-12-15
  • 打赏
  • 举报
回复
create procedure test @count int
as
if @count <= 0
begin
raiserror('数量必须大于0,重来',16,-1)
return
end
exec('SELECT top '+cast(@count as varchar)+' * FROM authors order by newid()')
go

--调用
exec test 3




youngby 2003-12-15
  • 打赏
  • 举报
回复
select top @count * from table
where right(身份证号码 ,cast((RAND()*10) as int )= cast(cast((RAND() *10 ) as int) as char)

youngby 2003-12-15
  • 打赏
  • 举报
回复
哈哈,,,

SELECT top @count * FROM authors order by newid()
youngby 2003-12-15
  • 打赏
  • 举报
回复
select top @count * from table
where right(身份证号码 ,1)= cast(cast((RAND() *10 ) as int) as char)
pbsql 2003-12-15
  • 打赏
  • 举报
回复
不用随机数吧,这样随机排序:
SELECT * FROM T1 order by newid()

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧