首页 > 解决方案 > 在 SQL Server 中生成稳定的随机数

问题描述

我在 SQL Server 2012 中工作。我正在清理数据,并试图随机打破地址分配算法中的联系。这需要我生成随机数。这个答案采用的方法不起作用,因为 WITH 子查询似乎重新生成了连接的每一侧,从而导致同一行的随机数不同。

这段代码复制了这个问题:

WITH
initial_table AS (
    SELECT 1 AS id
),
random_values_added AS (
  SELECT id, ABS(CHECKSUM(NEWID())) % 10 AS rand
  FROM initial_table
)
SELECT t1.id, t2,id, t1.rand, t2.rand
FROM random_values_added t1 FULL OUTER JOIN random_values_added t2
ON t1.id = t2.id AND t1.rand = t2.rand
    

标签: sqlsql-server

解决方案


您可以使用一个技巧使用rand(). 假设这id是独一无二的,您可以从以下内容开始:

WITH initial_table AS (
      SELECT 1 AS id
     ),
     random_values_added AS (
      SELECT id, FLOOR(RAND(id) * 10) AS rand
      FROM initial_table
    )

这并不完全令人满意,因为每次运行代码时它都会返回相同的值。getdate()为此,我们可以使用每个查询评估一次的事实:

WITH initial_table AS (
      SELECT 1 AS id
     ),
     random_values_added AS (
      SELECT id, FLOOR(RAND(DATEADD(second, id, GETDATE()) * 10) AS rand
      FROM initial_table
    )

推荐阅读