T-SQL语句来写避免重复随机数出现的代码

  1. 有一张表 test 如下结构和虚拟数据

图片说明

其中列num1、num2 数据来源是由一句tsql存错过程的随机数语句产生并修改的,其中行数据最先只会生成姓名,而不随机分配2个数字,只有触发这个存错过程才会修改对应的行的num1、num2.

select cast(ceiling(rand() * 2) as int) as num1 ,cast(ceiling(rand(checksum(newid())) * 5) as int) as num2

请教如何写一个存储过程,来每次点击的时候就像在客户端一样的会有集合来取到所有降序排列的行明细,然后将 num1、num2 记录成一个集合,然后再分别判断,当赵八这个人需要进行随机数分配时,不让他的第一位是1,因为第一位连续1这个数字已经5笔了,我需要第六笔刻意变成2,然后num2的判断是不能连续三笔都是一样的。比如说 张三的num2是 2 李四的num2是 2 到王五这就不能是2,是随机别的数,就是怎么也不会随机成3个一样num2的行数据。有的高手说是用临时表来做,可以贴代码给小弟参考参考吗?如果不用临时表可以用tsql语句解决吗,感谢,因为一些特殊的原因不能在c# 客户端做限制和判断,敬请大哥们不吝帮忙,感谢万分
(因位num1这个栏位的随机数只能是 1或者2,如果连续随机出过5个1或者5个2,那我就要人为干预第6个出现的随机数必须是相反的那个数
num2这个栏位是1-5 的区间,如果出现连续三条是一样的数字,那么也需要干预随机数不能第四条还是和之前三条一样的数字这个逻辑。以上、补充说明)

按你的需求,首先要做的是获取随机数。然后取值,然后判断,然后更新数据
1:获取随机数:num1没要获取随机数,num2获取随机数 ( Select Round(Rand()*4+1,0) )注意:1到5取随机数,重复概率很大需要做验证

2:创建存储过程:
CREATE PROCEDURE [dbo].[updateTable]
AS

BEGIN
--创建临时表存储需要用到的数据
CREATE TABLE #T1(row int,num1 int,num2 int); --存储num1和num2为空的数据
CREATE TABLE #T2(row int,num1 int,num2 int); --存储降序排列test表的TOP5行数据

--插入值
insert into #T1 select row,num1,num2 from test where num1 is null and num2 is null; --获取空数据插入
insert into #T2 select top 5 row,num1,num2 from test where num1 is not null and num2 is not null order by row desc; --降序排列test表的TOP5行数据插入

--验证
--声明变量
DECLARE @num1 INT ,@num2 INT ,@t1num1 INT,@t2num1 INT,@t2num2 INT;

set @num1 = (select top 1 num1 from #T2 order by row desc); --表2中最后1条数据num1的值
set @num2 = (select top 1 num2 from #T2 order by row desc); --表2中最后1条数据num2的值
set @t1num1 = (select sum(num1)snum1 #T2); --表2中最近5条数据num1的值
set @t2num1 = (select top 1 num2 from #T2); --表2中第1条数据num2的值
set @t2num2 = (select top 1 num2 from #T2 order by row desc); --表2中第2条数据num2的值

if @t1num1 > 5
BEGIN
--最近5条数据中的num1的值不重复

--获取表1中最后一条的num1的值

--游标遍历表1更新num1的值

--判断num2的值
if @t2num1 = @t2num2
BEGIN
    --获取随机数更新对应row的num2的值

END

END

END

注意:sql没有验证,不对的自己修改下,大体思路这样,
后续想到更好的思路在更新。希望对你有帮助

如果你希望不连续重复,或者不重复,都必须要有一个临时表,把之前生成的保存起来,然后才能避免重复。
你一会儿说避免重复,一会儿说允许不超过5个重复,并不是非常清楚你到底要做什么,请补充描述清楚。

如果只是单纯的不让他出现多个重复,不知道是不是可以这样哈。row%2+1得到num1这个列的值,row%5+1得到num2这个列,这样永远不会出现你说的几个连续重复的问题了,不知道满不满足你的需求哈,只是个想法