我正在尝试使用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**
关于我缺少的任何想法?
感谢。
答案 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;
您不需要临时表。您不需要其他查询。