【问题标题】:Access Random Number for Each Record Based on Count of a Field根据字段计数访问每条记录的随机数
【发布时间】:2015-02-09 23:48:26
【问题描述】:

我正在尝试为查询中的每条记录生成一个随机数。该数字必须介于 1 和字段计数之间。这个我试过了

Int((0-(Count(IIf([ID]=4441,"")))+1)*Rnd()+(Count(IIf([ID]=4441,""))))

我认为它可以正常工作,只是它为每条记录提供了相同的编号。如果我这样做 Rnd([field]) 它会为每条记录提供不同的数字,但这些数字介于 0 和 1 之间。我如何才能两全其美,并根据我的特定标准为每个字段获得不同的数字?

谢谢

【问题讨论】:

  • 所以您想要介于 1 和 4441 之间的唯一数字?
  • 不,我想要一个介于 1 之间的数字,但是许多记录在 ID 字段中都有该值。它会一直改变。我可能写错了 IIf 语句,Count(IIf([ID]=4441,[ID],"")) 可能更正确
  • 所以你不介意重复数字吗?您能否编辑您的原始帖子以显示一些示例数据和您希望看到的结果?

标签: ms-access


【解决方案1】:

“随机”会产生重复的结果,因为您没有要求唯一的随机结果,这里是产生随机数的正确方法:

Random 的正确语法是:

Int ((upperbound - lowerbound + 1) * Rnd + lowerbound)

在你的情况下

Exp: Int(((total) - 0 +1) * Rnd + 0)

在此处阅读更多信息:http://www.techonthenet.com/access/functions/numeric/rnd.php

编辑:

所以我做了一些玩弄,并带来了这个:

Select T1.ID,
(SELECT top 1 Int((count(*)-0+1)*Rnd()+0) From tbl_table as T2 where T2.ID = T1.ID)
From tbl_Table as T1

或者在你的模块中创建一个公共函数: 像这样:

Public Function GET_RAND(i As Long, UV As Long, LV As Long) As Long
    'i is no where used it just forces access to process this function rather than getting the result from cache
    GET_RAND = Int((UV - LV + 1) * Rnd + LV)
End Function

并像这样在查询中访问它:

SELECT T1.id, get_rand([id],(select count(*) from tbl_table),0) AS Expr1
FROM tbl_table AS T1;

对我个人而言,这是没有用的,除非我不关心重复的结果。也许您可以添加更多代码并使其更适合您的需求

【讨论】:

  • @PaulFrancis 谢谢你,我学会了访问缓存UDF函数的调用方法来呈现结果。
  • 我会将子查询更改为(SELECT TOP 1 Int((Count(*) - T1.ID + 1) * Rnd() + T1.ID) From tbl_table as T2 where T2.ID = T1.ID) AS tmpExp FROM tbl_table AS T1;。由于每条记录没有不同的值,您似乎得到的唯一值是 0 和 1。
  • 非常感谢您的工作,但我真的希望它为每条记录提供一个唯一编号。这会改变你在这里写的内容吗?
猜你喜欢
  • 2020-05-20
  • 2010-11-23
  • 1970-01-01
  • 2021-03-26
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
相关资源
最近更新 更多