在ms-access数据库中我有一个表
num weight
1 12
4 13
2 13
6 9
7 13
如何编写一个查询,按照权重按降序对表进行排序。但是数字4,2和7具有相同的权重(13),因此每次运行查询时它们必须随机排序。
任何帮助表示感谢。
答案 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
行随机排列,但4
和1
行保留在同一位置,因为前三个的权重均为6
且权重为13
最后两个分别是12
和9
。
我已更新上述查询以匹配此新信息。
答案 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()