weixin_42853935 2019-07-09 16:13 采纳率: 85.7%
浏览 388
已采纳

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 的区间,如果出现连续三条是一样的数字,那么也需要干预随机数不能第四条还是和之前三条一样的数字这个逻辑。以上、补充说明)

  • 写回答

3条回答 默认 最新

  • Sometimes_Ymc 2019-07-10 10:31
    关注

    按你的需求,首先要做的是获取随机数。然后取值,然后判断,然后更新数据
    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没有验证,不对的自己修改下,大体思路这样,
    后续想到更好的思路在更新。希望对你有帮助

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?