如何使用纯SQL选择N个随机行?

如何使用纯SQL选择N个随机行?,sql,random,Sql,Random,如何使用单个纯SQL查询组合和选择N个随机行?理想情况下,我希望尽可能避免使用存储过程。这可能吗 澄清: 纯SQL指的是尽可能接近ANSI/ISO标准。 解决方案应该足够有效。兰德公司授予的订单可能有效,但正如其他人所指出的,这对于中型表是不可行的。 您问题的答案在第二个链接中: SELECT * FROM table ORDER BY RAND() LIMIT 1 只需更改SQL Server的限制和/或重写: SELECT TOP 1 * FROM table ORDER BY newid

如何使用单个纯SQL查询组合和选择N个随机行?理想情况下,我希望尽可能避免使用存储过程。这可能吗

澄清:

纯SQL指的是尽可能接近ANSI/ISO标准。 解决方案应该足够有效。兰德公司授予的订单可能有效,但正如其他人所指出的,这对于中型表是不可行的。
您问题的答案在第二个链接中:

SELECT * FROM table ORDER BY RAND() LIMIT 1
只需更改SQL Server的限制和/或重写:

SELECT TOP 1 * FROM table ORDER BY newid()
现在,这严格地回答了你的问题,但你真的不应该使用这个解决方案。在一张大桌子上试一下,你就会明白我的意思了

如果您的键空间是连续的,或者没有孔,或者只有很少的孔,并且如果它只有很少的孔,那么您不必太担心某些行被拾取的几率比其他行稍高,那么您可以使用一种变体来计算要随机检索的键,范围从1到表中的最高键,然后检索键等于或高于计算值的第一行。仅当关键点空间有孔时,才需要高于的零件

此SQL留给读者作为练习


编辑:注意,这里对另一个答案的评论提到纯SQL可能意味着ANSI标准SQL。如果是这样的话,那么就没有办法了,因为没有标准化的随机函数,也不是每个数据库引擎都以相同的方式处理随机数函数。我见过的至少一个引擎通过调用一次并对所有行重复计算值来优化调用。

我不知道纯ANSI,这并不简单,但您可以在这里查看我对类似问题的回答:

这里有一个潜在的解决方案,它可以让您平衡获得少于N行的风险和来自表格前面的采样偏差。这假设N与表的大小相比很小:

select * from table where random() < (N / (select count(1) from table)) limit N;
这通常会对大多数表进行采样,但返回的行数可能少于N行。如果可以接受某些偏差,则可以将分子从N更改为1.5*N或2*N,以使返回N行的可能性非常大。此外,如果需要随机化行顺序,请不要仅选择随机子集:

select * from (select * from table
                where random() < (N / (select count(1) from table)) limit N)
 order by mod(tableid,1111);
这种解决方案的缺点是,至少在PostgreSQL中,它使用表的顺序扫描。较大的分子将加快查询速度。

这可能有助于您:

SELECT TOP 3 * FROM TABLE ORDER BY NEWID()

使用下面的代码,您可以实现您想要的功能

select top 1 * from student1 order by newid()

更改N的值,其中前1位,这样您将收到该数量的随机记录

如果假设3为假,我不清楚如何实现您的建议,也就是说,您的表有漏洞。您必须重写整个表,使假设3为真,因此操作非常缓慢。创建一个列与原始表相同的新表,并为一个没有间隙的新主键创建一个标识列。然后将整个原始表插入到新表中。如果您想要真正的随机样本,那么NEWID是个坏主意,guid有很多结构。但是,如果您不在乎是否真的随机,请继续。-1,已经包含但不是纯SQL newid是Microsoft特定的。-1,已经包含在stackoverflow.com/a/396946/14731中,并且不是纯SQL newid是Microsoft特定的。