SQL-Server 上的可重复随机排序

rur*_*i88 5 t-sql sql-server

我想知道是否有人知道如何在 MS SQL Server 上执行可重复的随机排序。

我通过在随机函数上设置种子值在其他数据库平台上实现了相同的效果:

MySQL/MariaDB: ORDER BY RAND(?);
Oracle: EXEC DBMS_RANDOM.SEED(?); ORDER BY DBMS_RANDOM.VALUE;
Postgres: SELECT SETSEED(?); ORDER BY RANDOM();
Run Code Online (Sandbox Code Playgroud)

但是,我在 SQL-Server 上找不到等效项。经过一些研究,我尝试了语法 TABLESAMPLE(100 PERCENT) REPEATABLE(Y)。但 TABLESAMPLE 似乎没有以任何随机顺序返回行。

SQLFiddle: http: //sqlfiddle.com/#!3/d50dd /30

rur*_*i88 2

这可能不是大型表格的最佳解决方案,但它适用于大多数较小的表格集。

ORDER BY RIGHT(STR(RAND(id + seed), 18, 18), 1);

解释一下它的作用:

  • 我们根据传递的 row_id + 种子值生成一个随机浮点值。该浮点值的长度为 18 位。
  • 将随机浮点值转换为字符串,这样我们就可以对该值使用 T-SQL 本机字符串函数。
  • 使用 T-SQL RIGHT() 函数获取随机浮点值的最后一位数字。用它来订购。

我不确定性能如何,但我预计对于大型数据集来说,性能会相当平均甚至很差。

SQLFiddle: http: //sqlfiddle.com/#!3/d50dd /95