奖项 名额
特等奖 3
一等奖 10
二等奖 25
三等奖 40
四等奖 80
共1000人左右参加抽奖 使用的是工号如何进行不重复随机抽奖呢???
谢谢!我想表的设计结构应是:ID,工号, 姓名,部门, 是否已中奖
特等奖 3
一等奖 10
二等奖 25
三等奖 40
四等奖 80
共1000人左右参加抽奖 使用的是工号如何进行不重复随机抽奖呢???
谢谢!我想表的设计结构应是:ID,工号, 姓名,部门, 是否已中奖
解决方案 »
- 求一分组统计的SQL语句
- 感谢 happyflystone大哥的短信帮助赠送60分表示感谢:它人不用来接分了谢谢合作
- 请教一个简单问题
- sql2005中用函数得到汉字首字母拼音,但总不能得到正确结果!
- 紧急求助:关于sql server 2000数据库安全的问题
- sql数据库导入问题
- SQL2000 最近频繁出现"一般性网络错误 请检查网络文档"
- 再来简单问题
- Sql 自定义错误信息处理
- 怎样为全局唯一标识符列创建 DEFAULT 定义,又怎样使用 NEWID 功能生成全局唯一数值。
- 这个数据库用T-SQL语句怎么写啊?
- 真怪了,新建一个数据库,竟然没有系统存贮过程,记得新建后,就该有很多系统自带的存贮过程的,为何?
where 是否已中奖='NO'
order by newid()
生成100万条8位不重复数据的示例USE tempdbGO -- 创建测试表CREATE TABLE tb(id char(8)) -- 创建用于自动过滤重复值的唯一索引CREATE UNIQUE INDEX IX_tb ON tb(id)WITH IGNORE_DUP_KEY GO -- 测试数据插入的处理时间, 记录开始处理的时间点DECLARE @dt datetimeSET @dt = GETDATE() -- 插入随机数据SET NOCOUNT ONDECLARE @row intSET @row = 1000000 -- 设置总记录数WHILE @row >0BEGIN -- 显示提示信息, 表示还需要插入多行数据 RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT -- 插入随机的位编码数据 SET ROWCOUNT @row INSERT tb SELECT id = RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8) FROM syscolumns c1, syscolumns c2 SET @row = @row - @@ROWCOUNTEND -- 显示插入数据使用的时间SELECT BeginDate = @dt, EndDate = GETDATE(), Second = DATEDIFF(Second, @dt, GETDATE()),GO -- 显示最终的结果记录是否正确SELECT COUNT(*) FROM tbGO -- 删除测试DROP TABLE tb 解决中用到的技巧:1. 控制产生的数据不重复,直接使用唯一索引中的 IGNORE_DUP_KEY 选项,使插入数据中的重复值自动过滤,避免手工处理重复2. 使用 CHECKSUM 配合 NEWID() 函数,使生成的数据尽量随机,一般生成随机数会考虑使用 RAND() 函数,但这个函数是产生伪随机值,用下面的语句测试一下,会发现产生的数据全部是一样的,这不适用于想批量生成多个随机数,而NEWID() 函数生成的是GUID,基本上不会有重复的,再通过CHECKSUM将其转化成数字,这样产生重复的可能性会比较小SELECT TOP 10 RAND()FROM sysobjects3. 在效率控制,使用循环+批量生成的方式,而不是传统的逐个生成。在SQL Server中,每个插入语句都会有一个内部的事务处理,如果逐条插入,则事务的开销太大,效率势必非常低;不考虑一次性生成100万数据,一则因为生成的数据可能有重复的,去掉重复就没有100万了,二则一次性生成100万数据,消耗的内存和CPU资源也很高,一般的电脑可能承受不住
表一:
ID, 工号, 姓名, 部门, 中奖编号
表二:
ID, 中奖编号,奖项在页面程序里设计 random:)
人事档案表:人事ID,工号, 姓名,部门....
奖品表:奖品编号,奖品名称
获奖表:人事ID,奖品编号----抽奖过程
才1000人,使用循环的方法实现,
FOR(int i=0;i<1000;i++)
{
WHILE (是否抽奖成功=false)
{
IF(是否抽奖成功=true) break;
--随机生成一个获奖编号
IF(判断获奖编号是否存在,当存在时)
IF(是否该奖品是否已经给抽完)=抽完
--重新随机生成一个获奖编号,返回上一步骤
else
--把获奖信息写入数据库
ELSE
{
--把不获奖信息写入数据库,直接转到下一个人抽奖
}
}
}
呵呵,不知道是否ok哦!!?
begin
自己中奖
end
else
begin
if 自己已中奖
begin
下一个中奖号码
end
下一个
end
select top 3 NEWID() as tmp_id,* from Tb_所有
where id not in Tb_中将
order by tmp_id