SQL - 使用 NEWID() 从临时 table 返回随机行
SQL - Returning random rows from a temporary table using NEWID()
我正在尝试使用 NEWID()
函数将源 table 中的数据插入到临时 table 中,以便我得到(相当)随机的 select来自我来源的行离子 table.
查看下面的代码,我将我需要的数据插入到临时 table #x
和 Point 1 我 select 来自 #x
,它 returns 随机排列的数据。
但是,在 点 2 我正在缩小来自 #x
的数据(我累积行直到达到一定数量) SELECT不再 returns 随机行 - 它从 table.
开始按顺序排列 returns 行
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**
关于我遗漏的任何想法?
谢谢。
哈哈。您的行号是确定性的。可能有更好的方法来做你想做的事,但你可以通过随机化 行号 :
来修复上面的代码
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;
您不需要临时 table。您不需要额外的查询。
我正在尝试使用 NEWID()
函数将源 table 中的数据插入到临时 table 中,以便我得到(相当)随机的 select来自我来源的行离子 table.
查看下面的代码,我将我需要的数据插入到临时 table #x
和 Point 1 我 select 来自 #x
,它 returns 随机排列的数据。
但是,在 点 2 我正在缩小来自 #x
的数据(我累积行直到达到一定数量) SELECT不再 returns 随机行 - 它从 table.
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**
关于我遗漏的任何想法?
谢谢。
哈哈。您的行号是确定性的。可能有更好的方法来做你想做的事,但你可以通过随机化 行号 :
来修复上面的代码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;
您不需要临时 table。您不需要额外的查询。