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

时间:2008-12-29 01:20:28

标签: sql random

我们如何组合How to request a random row in SQL?Multiple random values in SQL Server 2005使用单个纯SQL查询选择N个随机行?理想情况下,我希望尽可能避免使用存储过程。这甚至可能吗?

澄清

  1. 纯SQL指的是尽可能接近ANSI / ISO标准。
  2. 解决方案应该“足够有效”。授予ORDER BY RAND()可能会有效,但正如其他人指出的那样,这对于中型桌子来说是不可行的。

5 个答案:

答案 0 :(得分:4)

你的问题的答案在第二个链接:

SELECT * FROM table ORDER BY RAND() LIMIT 1

只需更改SQL Server的限制和/或重写:

SELECT TOP 1 * FROM table ORDER BY newid()

现在,这个严格回答你的问题,但你真的不应该使用这个解决方案。只要在一张大桌子上试试,你就会明白我的意思。

如果您的键区是连续的,无论是没有孔,还是只有很少的孔,如果它的孔很少,你就不会太担心某些行的拾取机会比其他行略高一些,那么您可以使用变量来计算要随机检索的键,范围从1到表中的最高键,然后检索键等于或高于您计算的键的第一行。如果你的密钥空间有洞,你只需要“高于”部分。

此SQL留给读者作为练习。


编辑:注意,此处对另一个答案的评论提到可能纯SQL 表示ANSI标准SQL。如果是这种情况,则没有办法,因为没有标准化的随机函数,每个数据库引擎也不会以相同的方式处理随机数函数。至少有一个我见过的引擎通过调用它来“优化”调用一次,只是重复所有行的计算值。

答案 1 :(得分:2)

我不知道纯ANSI,它并不简单,但你可以在这里查看我对类似问题的回答: Simple Random Samples from a Sql database

答案 2 :(得分:1)

这是一个潜在的解决方案,可以让您平衡从表格的“前面”获取少于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中,它使用表的顺序扫描。分子越大,查询速度越快。

答案 3 :(得分:-1)

这可能会对你有所帮助:

SELECT TOP 3 * FROM TABLE ORDER BY NEWID()

答案 4 :(得分:-2)

使用下面的代码,你可以实现你想要的......

select top 1 * from student1 order by newid()

更改前1位的N值,这样您就会收到该数量的随机记录。