【问题标题】:Random Number Generation in SQL ServerSQL Server 中的随机数生成
【发布时间】:2015-01-10 06:38:16
【问题描述】:

我需要为每一行生成一个介于两个数字之间的随机数。

例如:

select ColName,(1500 到 2000 之间的随机数) from TableName

提前致谢

【问题讨论】:

    标签: sql sql-server sql-server-2008 random sql-server-2012


    【解决方案1】:

    随机数公式为

    随机小数范围

    SELECT RAND()*(b-a)+a;
    

    示例

    SELECT RAND()*(25-10)+10; // Random between 10 to 25 
    

    随机整数范围

    SELECT FLOOR(RAND()*(b-a)+a);
    

    示例

    SELECT FLOOR(RAND()*(25-10)+10);
    

    【讨论】:

    • 你必须使用FLOORROUNDCEILING函数来避免小数部分。
    【解决方案2】:
    DECLARE @start INT
    DECLARE @end INT
    
    SET @start = 1500
    SET @end = 2000
    
    SELECT  Round(( ( @end - @start - 1 ) * Rand() + @start ), 0)
    

    更新:获取每一行的随机数。

    select ABS(Checksum(NewID()) % (@end-@start)) + @start
    

    【讨论】:

    • 我需要为每一行设置一个随机数。这不会为每一行生成不同的值
    • 需要稍作改动
    • @VigneshM - 现在检查。
    • NewId() 包含一些互锁的线程变量,我更喜欢使用 getdate 和 @@packet_received 以获得随机数:rand(@@spid+ @@PACK_RECEIVED + datepart(microsecond,getdate()) )
    【解决方案3】:

    需要稍作改动,通过替换以下代码它会响应。

     Round(( ( @end - @start - 1 ) * Rand(checksum(newid())) + @start ), 0)
    

    例如:

    生成相同的值:

    select top 10 ROUND(((2000 - 1500 -1) * RAND() + 1500), 0) 来自 sysobjects

    产生不同的价值:

    select top 10 ROUND(((2000 - 1500 -1) * Rand(checksum(newid()))+ 1500), 0) 来自 sysobjects

    【讨论】:

      【解决方案4】:
      SELECT ROUND(((2000 - 1500 -1) * RAND() + 1500), 0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        相关资源
        最近更新 更多