【问题标题】:How to generate 100000 no repeat random numbers in SQL SERVER2008如何在 SQL SERVER 2008 中生成 100000 个不重复的随机数
【发布时间】:2014-06-22 06:20:28
【问题描述】:

我想在 SQL SERVER2008 中生成 100000 个不重复的随机数。

这些数字必须介于 1 到 100000 之间。如下所示:

RandNumber

   100
   9
   1000
   34
   67
   546
   64000

【问题讨论】:

  • 如果您想要 1 到 100,000 之间的 100,000 个没有重复的数字,那么无论如何只有一组数字适合!您是在问如何随机订购这些?
  • 它怎么可能是一个没有“无重复”约束的问题的重复项?随机排序数字 1..100000 与选择 1000000 随机数字不同,这可能是相同的。请注意问题本身,而不仅仅是标题。
  • @Martin Smith 我想生成 100000 个不重复的随机数插入到一个空表中
  • 如果数字是整数,那么在 1 到 100,000 之间获得 100,000 的唯一方法是使用该范围内的所有整数。所以根本没有随机性。

标签: sql-server sql-server-2008


【解决方案1】:

由于 sql 表中记录的顺序没有意义,所以你要做的就是创建一个从 1 到 100000 的连续整数值的表。 说,类似的东西:

--Create the table and populate it
SELECT TOP 100000 IDENTITY(int,1,1) AS IntValue 
INTO NumbersTable 
FROM sys.objects s1     
CROSS JOIN sys.objects s2 

-- Set the IntValue column as the primary key and clustered index
ALTER TABLE NumbersTable ADD CONSTRAINT PK_NumbersTable PRIMARY KEY CLUSTERED (IntValue)

然后,您可以从该表中使用如下查询以随机顺序选择数字:

-- Select values in a random order
SELECT IntValue
FROM NumbersTable 
ORDER BY NEWID()

NEWID() 函数生成一个唯一标识符 (GUID)。由于 guid 是按随机顺序创建的,因此您可以使用它对查询输出进行随机排序。

【讨论】:

  • INSERT INTO dbo.Test(ID) SELECT IntValue FROM NumbersTable ORDER BY NEWID() 不是随机顺序
  • @user3757263 因为从关系的角度来看,表中的行是无序的。因此 SQL Server 2012+ 只是优化了 ORDER BY 在这里 and ignores it
  • 我从 开始我的回答,因为 sql 表中的记录顺序没有意义。正如 Martin Smith 所说,将记录插入表时无法对记录进行排序。
【解决方案2】:

您可以使用递归 CTE 来生成数字。

CREATE TABLE [Numbers]
  (
     [Number] INT,
     CONSTRAINT [PK_Numbers] PRIMARY KEY ([Number])
  );

WITH [cteNumbers]
     AS (SELECT 1 AS [Number]
         UNION ALL
         SELECT [cteNumbers].[Number] + 1
         FROM   [cteNumbers]
         WHERE  [cteNumbers].[Number] < 100000)
INSERT INTO [Numbers]
            ([Number])
SELECT [cteNumbers].[Number]
FROM   [cteNumbers]
OPTION (MAXRECURSION 0);

请注意,使用递归 CTE 时,无需将数字存储在表中即可使用它们,您只需在需要的地方使用递归 CTE 定义即可。

请记住包含OPTION (MAXRECURSION 0)

如果您想以随机顺序使用数字,order them randomly

【讨论】:

    【解决方案3】:

    我认为与其使用 WHILE LOOP,不如使用以下方法:

    DECLARE @TempTable TABLE( Numbers INT)
    
    ;WITH CTE AS
    (
        SELECT 0 Units UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
        SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 
    )
    INSERT INTO @TempTable( Numbers)
    SELECT Unit.Units + Hundred.Units * 10 + Thousand.Units * 100 
           + Lakh.Units * 1000 + TenLakhs.Units * 10000 + 1 Numbers
    FROM CTE Unit,
    CTE Hundred,
    CTE Thousand,
    CTE Lakh,
    CTE TenLakhs
    
    
    SELECT *
    FROM @TempTable
    

    只是上面查询中使用的简单数学。

    【讨论】:

      【解决方案4】:
      CREATE TABLE Numbers (id bigint IDENTITY(1,1) NOT NULL)
      INSERT Numbers DEFAULT VALUES
      GO 100000
      SELECT id FROM Numbers ORDER BY NewID()
      GO
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-01-10
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多