如何在T-SQL中选取指定区间内的随机行
如何在T-SQL中选取指定区间内的随机行
嘿,我来帮你搞定这个问题!你想要从表中获取10到20条随机行,而不是固定数量的随机行,对吧?先说说你之前写的语句里的小问题:ABS(CHECKSUM(NewId())) % 19 BETWEEN 10 and 20中,%19的结果范围是0到18,所以BETWEEN 10和20其实只能匹配到10到18的数值,最多返回9行,既达不到你要的下限10,也覆盖不了20,而且这种随机筛选的方式没法稳定保证行数在目标区间里,可能某次返回的行数会远低于预期。
给你两个靠谱的方案,按需选择:
方案一:每次返回10-20之间随机数量的行
适合你想要每次查询的行数是10到20之间某个随机数的场景,比如这次返回12行,下次返回18行。代码示例:DECLARE @RandomRowCount INT; -- 生成10到20之间的随机整数(包含10和20) SET @RandomRowCount = FLOOR(RAND() * (20 - 10 + 1)) + 10; SELECT TOP (@RandomRowCount) * FROM YourTable ORDER BY NEWID();原理很简单:先用
RAND()生成0-1的随机数,乘以11(因为20-10+1=11,覆盖11个不同数值),取整后加10就得到10到20的随机数。然后用TOP(@RandomRowCount)结合ORDER BY NEWID()获取完全随机的行,这种方法能精准控制行数范围。方案二:无变量的CTE写法
如果你不想用变量,也可以用公共表表达式(CTE)先给所有行按随机顺序编号,再取前N行(N是10-20的随机数):WITH RandomlyOrderedRows AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNumber FROM YourTable ) SELECT * FROM RandomlyOrderedRows WHERE RowNumber <= FLOOR(RAND() * 11) + 10;这里
RAND()在查询执行时只会计算一次,所以本次查询的行数是固定的10-20之间的某个数,同样能满足需求。
对比你最初的方法,这两种方式都更可靠,因为ORDER BY NEWID()是T-SQL里获取随机行的标准做法,能保证每行被选中的概率均等,而且能稳定控制返回的行数范围。
内容来源于stack exchange




