1

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

查看下面的代码,我将所需的数据插入到临时表中#x,并在我从中选择的第 1 点#x处,它以随机顺序返回数据。

但是,在第 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**

关于我所缺少的任何想法?

谢谢。

4

1 回答 1

1

哈哈。您的行号是确定的。可能有更好的方法来做你想做的事,但你可以通过随机化行号来修复上面的代码:

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;

您不需要临时表。您不需要额外的查询。

于 2016-07-07T15:34:05.880 回答