Microsoft Access查询以看似不可能的条件来检索随机交易

时间:2018-06-20 18:34:44

标签: sql ms-access random ms-access-2010

我被要求协助制定报告,以检索特定日期范围内25%的随机交易样本。我不是程序员,但能够很快设计出以下内容:

SELECT TOP 25 PERCENT account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init 
FROM account INNER JOIN log ON account.ACCT = log.ACCT
GROUP BY account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init
HAVING (((log.DATE) Between #2/7/2018# And #6/15/2018#) AND ((log.action_txt)="mod" Or (log.action_txt)="del") AND ((log.init)="J1X" 
ORDER BY log.tran_dt

这将返回日期范围内25%的记录。每个记录行都是唯一的,但是每个帐号每天可能都有多个记录。在某些情况下,记录的日期和tran_id也相同。

与请求者进行进一步讨论后,他实际上想查看在该日期范围内每天有活动的25%帐户的所有交易。因此,如果2018年3月1日有100个账户在此表中有记录,他想查看其中25个账户的所有交易;如果2018年3月2日有60个账户在此表中有记录,他想查看其中15个账户的所有交易;等等。

我一直认为Access模块​​在这种情况下效果最好,因为我认为其中包含多个部分。我发现我需要一个功能来遍历日期范围和每一天: 1.仅计算一次帐号 2.退还全部帐户的25%的所有交易

但是,正如我所提到的,我不是一名程序员,并且为寻找许多部分的可能解决方案而精疲力尽。

1 个答案:

答案 0 :(得分:0)

我认为问题的关键在于,您实际上只需要为报告随机选择一个结果即可。因此,您可以强制随机数生成器根据记录中的值和当前时间对结果重新排序。

类似的事情应该起作用-我假设您的actiontxt字段是一个文本字段,然后拉出每个字段的长度并将其应用于当前日期/时间,以创建可以排序的伪随机数。

我真正要做的就是更改您的ORDER BY

看看这是否适合您

SELECT TOP 25 PERCENT 
account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, 
log.to_data, log.tran_id, log.init 
FROM account 
INNER JOIN log ON account.ACCT = log.ACCT
GROUP BY account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init
HAVING (((log.DATE) Between #2/7/2018# And #6/15/2018#) AND ((log.action_txt)="mod" Or (log.action_txt)="del") AND ((log.init)="J1X" 
ORDER BY Rnd(CLng(Now()*Len(log.action_txt))-(Now()*Len(log.action_txt)));

修改了other StackOverflow question and response的类似构想