如何 select 基于可重复播种的固定数量的随机行?

How to select a fixed number of random rows based on a repeatable seeding?

我正在苦苦思索如何修复,例如,SQL 中 table 的 5 个随机行。但是每次我 运行 使用给定种子的代码时,我都需要能够重复 table 检索相同的 5 行。

我尝试使用

SELECT TOP 5 *
FROM mytable
ORDER BY NEWID()

但是我每次 运行 代码时都没有得到相同的样本。

知道我该怎么做吗?

RAND 函数可以将种子作为参数。

但由此产生的“随机”浮动是可以预测的。
F.e.

select ID from table1 order by rand(ID)

会给出与

相同的顺序
select ID from table1 order by ID

所以种子需要加香料。
例如通过计算哈希。

declare @seed int = 42;
select top 5 *
from your_table
order by rand(HashBytes('MD5', concat(col1, @seed)));
GO
 id | col1
--: | ---:
164 |   64
200 |  100
188 |   88
150 |   50
106 |    6
declare @seed int = 42;
select top 5 *
from your_table
order by rand(HashBytes('MD5', concat(col1, @seed)));
GO
 id | col1
--: | ---:
164 |   64
200 |  100
188 |   88
150 |   50
106 |    6
declare @seed int = 43;

select top 5 *
from your_table
order by rand(HashBytes('MD5', concat(col1, @seed)));
GO
 id | col1
--: | ---:
111 |   11
112 |   12
117 |   17
180 |   80
150 |   50

db<>fiddle here