每次运行查询时随机排序

时间:2009-11-16 02:48:41

标签: ms-access

在ms-access数据库中我有一个表

num   weight
1       12  
4       13
2       13
6       9
7       13

如何编写一个查询,按照权重按降序对表进行排序。但是数字4,2和7具有相同的权重(13),因此每次运行查询时它们必须随机排序。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

通常,您的SQL将包含某种随机函数(看起来Access具有rnd()函数。)

所以你可以使用:

select num, weight, rnd(num)
from tbl
order by weight desc, 3

这将让你看到r用于测试目的。在真实的查询中,您可能只想使用以下内容:

select num, weight
from tbl
order by weight desc, rnd(num)

来自this page

  

当值大于0时,Rnd()返回下一个随机数   当value小于0时,Rnd()根据值返回相同的随机数。如果值只出现一次,您将不会注意到此行为。 Access也会重置种子,这意味着序列重新开始   当value等于0时,Rnd()返回最近生成的随机数

更新1:我不确定rnd()在以下查询中是执行一次还是每行执行一次 - 文档不清楚。注释似乎表明所有行都收到相同的结果,表明它可能是后者。 可能将其更改为rnd(num)rnd(abs(num)+1)将解决该问题。当我到达安装了Access的盒子时,我将不得不检查。

更新2:我现在在Access 2007中对此进行了测试,当你使用rnd(1)时,确实为每一行提供了相同的随机值。每次运行查询时, rnd(num)提供不同的值,并且各行获得不同的值。所以你需要的查询是:

select num, weight from tbl order by weight desc, rnd(num);

如果您创建一个包含两个Number字段的表,然后对其运行该查询,您会看到持续刷新(使用F5)将在2周围交换,{ {1}}和7行随机排列,但41行保留在同一位置,因为前三个的权重均为6且权重为13最后两个分别是129

我已更新上述查询以匹配此新信息。

答案 1 :(得分:0)

我认为这样可以解决问题......

ORDER BY weight, Rnd()

答案 2 :(得分:0)

在Access UI外部使用Access数据库引擎SQL中的RND()时,每个会话将使用相同的随机数序列(对VBA的Randomize没有本机支持)。

例如,连接到源然后连续三次执行SELECT RND();,您将获得以下值:

0.705547511577606 
0.533424019813538 
0.579518616199493

关闭连接,再次连接到源,然后再次执行相同的查询三次,您将获得与上述相同的三个值。

在知道这些值是可预测的情况下,我们可以证明每次引用RND()时都会使用不同的值。请考虑以下问题:

SELECT RND() 
  FROM T 
 WHERE RND() > CDBL(0.6);

我们知道新会话中的第一个值为0.705547511577606,因此表达式为

RND() > CDBL(0.6)

将评估TRUE。但是,对于表0.533424019813538中的每一行,值T都是重复,这个值不满足WHERE子句!很明显,RND()子句中WHERE的值与SELECT子句中的值不同。完整的代码发布在下面。

注意我想知道是否有可能使用CURRENT_TIMESTAMP值的最低有效部分生成一个随机数,该随机数可以在单个查询的范围内一致地使用,并且不能作为{{{{{{ 1}}是。但是,Access数据库引擎不支持它,它最接近的类比RND()函数没有足够的粒度可用:(

NOW()