【问题标题】:TSQL random value from table select in every row从表中选择每行中的 TSQL 随机值
【发布时间】:2014-06-26 01:27:35
【问题描述】:

使用RAND() 函数或NEWID() 在每一列中生成一个随机值,如described here,您可以连续生成随机值。但是......该值在每一行中重复相同。

如何在每一行的每一列中生成一个随机值?我想在 B1 列中显示一个随机产品,该产品也在“102”组中。 B2 列相同,但产品不同。下一排又是两种不同的产品,依此类推。结果将显示每个产品(行)来自同一组的 2 个替代产品。

我的代码如下所示:

DECLARE @B1 varchar(30)
DECLARE @B2 varchar(30)
SET @B1 = (SELECT TOP 1 ItemCode FROM items WHERE items.Assortment IN (102) ORDER  BY RAND())
SET @B2 = (SELECT TOP 1 ItemCode FROM items WHERE items.Assortment IN (102) ORDER  BY NEWID())

SELECT ProdCode, ProdName, @B1 as B1, @B2 as B2
FROM Products
WHERE ProductGroup IN (102) --use IN so you can select multiple groups

谢谢!

【问题讨论】:

  • 在select中添加子查询而不是变量
  • 这就是 RAND() 的工作原理——它只被评估一次。有关其他想法,请参阅 this questionthis question
  • @Serpiton 我以前试过,结果还是一样。
  • @AaronBertrand 谢谢,this link 很有帮助,但我不太清楚我应该如何在我的情况下应用它。你能指出我正确的方向吗?谢谢!
  • 我怀疑您的问题更多是关于唯一 ID,但您可能会探索不同的随机播种方式。 SELECT AddressID, RAND(AddressID) AS Random FROM SalesLT.[Address]

标签: sql sql-server random


【解决方案1】:

您需要从主查询中添加一些内容,以便为每一行重新计算子查询 - 即:

SELECT 
    ProdCode, 
    ProdName, 
    (
        SELECT TOP 1 ItemCode 
        FROM items 
        WHERE items.Assortment IN (102) AND itemcode <> products.ProdCode
        ORDER BY NEWID(), products.ProdCode
    )
FROM Products
WHERE ProductGroup IN (102) 

【讨论】:

  • 是的,它应该参考主选择使用子选择。我尝试了您的解决方案,结果是,它在第​​ 1 行中给出了正确的随机值,但在每隔一行中给出了空值。但是,我将 itemcode products.ProdCode 放在子选择中的 where 中,这样就可以了。我已经编辑了你的答案,所以每个人都可以阅读适用于这个问题的代码。
【解决方案2】:

这是一种使用 while 循环遍历表中行的方法:

如果您在 Products 表中有 ID 列或其他内容,或者将其插入临时表以处理计算,则以下方法将有所帮助。

    DECLARE @MaxRowID INT
    DECLARE @RowID INT
    DECLARE @RandomNum FLOAT

    SET @RowID = 1

    SELECT @MaxRowID = MAX(ID) FROM Products

    WHILE ( @RowID <= @MaxRowID )
        BEGIN

            SET @RandomNum = RAND()

            UPDATE Products
            SET RandomNum = @RandomNum
            WHERE ID = @RowID

            SET @RowID = @RowID + 1

        END

    SELECT * FROM #Test

    DROP TABLE #Test

【讨论】:

  • 循环和 SQL 不是朋友。
  • 我没有遇到很多问题,但如果您处理足够大的数据集,它可能会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2019-07-30
  • 2023-04-03
相关资源
最近更新 更多