如何在Access中随机选择一定百分比的行?

时间:2017-06-08 11:02:52

标签: sql ms-access random

我有一张桌子,比方说,男孩,女孩,购买数量和价格。我想随机选择10%的女孩,条件是他们花的钱应该是两组花费的总金额的30%。要选择10%的女孩,我使用此代码:

SELECT TOP 10 PERCENT from Students Where StudentType='girl' ORDER BY rnd(ID)

我应该如何设置附加条件?

1 个答案:

答案 0 :(得分:0)

由于您已经选择了随机部分,因此问题实际上只是涉及“总数”的选择标准。这里的关键是你需要另一个查询,一个聚合查询。另一个查询可以是另一个保存的查询,嵌入的子查询,也可以是对执行查询的函数的调用。

使用子查询获取总数

SELECT TOP 10 PERCENT * 
FROM Students 
WHERE StudentType='girl' 
    AND (Students.[Spent] / (SELECT SUM(S2.[Spent]) FROM Students As S2) = 0.30)
ORDER BY rnd(ID)

确保为同一个表添加不同的别名,因为如果子查询具有与主查询同名的表,则Access可能会混淆。问题没有提到“花费的金额”专栏,所以我猜对了。这也假设“两个组”基本上与“所有学生记录”相同。如果不是这种情况,那么您可以添加到子查询WHERE S2.StudentType In ('girl', 'boy')

使用域聚合功能

SELECT TOP 10 PERCENT * 
FROM Students 
WHERE StudentType='girl' 
    AND (Students.[Spent] / DSum("[Spent]", "Students", "") = 0.30)
ORDER BY rnd(ID)

使用其他已保存的查询

首先创建单独的聚合查询并将其保存为[Summed]:

SELECT SUM(S2.[Spent]) As TotalSpent FROM Students As S2

现在进行交叉连接,以便每行与总数配对:

SELECT TOP 10 PERCENT * 
FROM Students, Summed
WHERE StudentType='girl' 
    AND (Students.[Spent] / Summed.TotalSpent = 0.30)
ORDER BY rnd(ID)

每种解决方案的效率可能会有所不同。对于一小桌学生来说,这可能并不重要。如果它确实成为一个问题,我发现Domain Aggregate函数效率不高,即使它们看起来更简单易用。更强大的查询引擎(不是Access)通常更好地分析查询计划并自动减少冗余计算,但使用Access时,您必须自己计划。

最后注意:如果您有更复杂的分组,则任何解决方案都将具有其他连接条件。例如,如果聚合查询在ID上也有一个GROUP BY子句,那么您现在需要一个与主表中的ID匹配的INNER JOIN,而不是交叉连接。对于域聚合函数,您需要指定引用表字段值的条件参数。关键是上述示例并非适用于所有情况的精确模板。