【问题标题】:MS Access - select one random record for each unique value in a columnMS Access - 为列中的每个唯一值选择一个随机记录
【发布时间】:2015-10-15 16:25:47
【问题描述】:

我有一张表格,其中包含来自 40 个不同供应商的约 3,000 张发票。在 MS Access 2013 中,我将如何从 40 个供应商中的每个供应商中随机选择一条记录?

这是我尝试过的代码,但就像我说的那样,它不会区分供应商代码,并且可以为我提供来自一个供应商的 40 个结果:

SELECT TOP 40 Vendors.Field1, Vendors.Vendor, Vendors.[Lgl Name], Vendors.[Pymnt Amt] INTO [Random Vendors] 
FROM Vendors ORDER BY Rnd(Field1);

【问题讨论】:

    标签: sql ms-access random


    【解决方案1】:

    假设该表名为invoices,并且您有一个名为vendors 的表,每个供应商一行:

    select v.*
           (select top 1 i.invoiceid
            from invoices as i
            where i.vendor = v.vendor
            order by rnd(i.invoiceid)
           ) as random_invoiceid
    from vendors as v;
    

    如果您需要发票的详细信息,请将其用作子查询:

    select i.*
    from (select v.*
                 (select top 1 i.invoiceid
                  from invoices as i
                  where i.vendor = v.vendor
                  order by rnd(i.invoiceid)
                 ) as random_invoiceid
          from vendors as v
         ) as vi join
         invoices as i
         on i.invoiceid = vi.random_invoiceid;
    

    【讨论】:

    • 一张桌子。原因是我需要 40 张随机发票并首先选择供应商,因为我们的系统不允许我一次向下钻取到每个人的发票级别。因此,我挑选了 40 家供应商,收集了他们所有发票的报告,为期 6 个月,并将其导出。我帖子中的代码是我如何选择最初的 40 个供应商的。至此,该表已经发挥了作用,我只处理发票。
    【解决方案2】:

    这个Office Support website 它给出了一个公式:Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

    你可以试试这样的:

    SELECT Vendors.Field1, 
           Vendors.Vendor, 
           Vendors.[Lgl Name], 
           Vendors.[Pymnt Amt] 
    INTO [Random Vendors] 
    FROM Vendors 
    WHERE Vendors.Field1 IN (Int(3000*Rnd(Field1)))
    GROUP BY Vendors.Vendor;
    

    这是假设 Field1 是发票编号。如果不是这种情况,那么您必须JOIN您的发票表。

    【讨论】:

    • 除非我错过了什么,否则这只是结束我一直在去的地方的另一种方式,甚至可能是一种更复杂的方式。我用我尝试过的代码更新了我的帖子,但没有做我需要做的事情。
    • 如果您想要每个供应商一个,您需要使用GROUP BY 子句。您还需要某种方式来区分您正在选择随机发票。如果您有 3000 张发票,则需要将其乘以 Rnd 函数。因为 Rnd 是从 0 到 1 排他性的。
    • 我已经尝试过 group by,它最终返回了所有 3000 张发票。 RND结果相乘的目的是什么?
    • 我在上面编辑了我的帖子。将 Rnd 乘以 3000 的目的是因为 Rnd 返回一个介于 0 和 1 之间的值(即 0.7347538)。我假设您没有 Field1 的任何十进制值。这就是为什么它不会返回任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2020-12-04
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多