SQL - 使用NEWID()从临时表返回随机行

时间:2016-07-07 15:30:56

标签: sql sql-server tsql temp-tables newid

我正在尝试使用NEWID()函数将源表中的数据插入到临时表中,以便从源表中获得(相当)随机选择的行。

查看下面的代码,我将我需要的数据插入临时表#x Point 1 ,我从#x中选择,它返回数据随机顺序。

然而,在 Point 2 我正在缩小#x的数据(我累积行直到达到一定数量),SELECT不再返回随机行 - 它返回行从表格的开头按顺序排列。

DROP TABLE IF EXISTS #x
CREATE TABLE #x (Id INT, Commodity VARCHAR(3), Quantity FLOAT, RowNum INT, TotalQuantity FLOAT)
INSERT INTO #x (id,commodity,quantity,rownum,totalquantity)
  SELECT
    i.id, i.commodity, i.quantity, ROW_NUMBER() OVER (ORDER BY i.id), SUM(i.quantity) OVER (ORDER BY i.id RANGE UNBOUNDED PRECEDING)
  FROM inventory i
  WHERE .........
        .........
  ORDER BY NEWID()


SELECT * FROM #x   -------- **POINT 1**


DECLARE @y INT = (SELECT MIN(rownum) AS minrownum FROM #x WHERE totalquantity >= @tonnes)


SELECT #x.id, #x.commodity, #x.quantity, #x.rownum, #x.totalquantity FROM #x
WHERE #x.rownum <= @y
ORDER BY NEWID()         -------- **POINT 2**

关于我缺少的任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

LOL。您的行号是确定性的。可能有更好的方法来执行您想要的操作,但您可以通过随机化行号来修复上述代码:

ROW_NUMBER() OVER (ORDER BY newid())

外部ORDER BY可能是不必要的。

你的查询虽然令人困惑。它选择前N行(按id)总计达总量。这很有道理。我不确定所有的随机化是什么。

编辑:

如果您需要获得随机行,直到达到某个数字,您可以执行以下操作:

SELECT i.*
FROM (SELECT i.*, SUM(i.quantity) OVER (ORDER BY NEWID()) as cume_quantity
      FROM inventory i
      WHERE .........
            .........
     ) i
WHERE cume_quantity - quantity < @tonnes;

您不需要临时表。您不需要其他查询。