如何在其他条件下随机选择一定百分比的行



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

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

我应该如何放置其他条件?

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

使用子查询获取总计

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)

确保在同一表中添加不同的别名,因为如果子查询的表格与主查询相同的表格,则访问会感到困惑。这个问题没有提到"花费的金额"列,所以我猜想了。这也假定"两个小组"与"所有学生记录"基本相同。如果不是这种情况,那么您可以添加到子查询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)

使用另一个保存查询

首先创建并保存单独的汇总查询为[求和]:

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)

每个溶液的效率可能会有所不同。对于一小部分学生,可能没关系。如果它确实成为一个问题,我发现域汇总函数即使似乎更易于使用,它们也不是很有效的。更强大的查询引擎(不访问(通常更好地分析查询计划并自动减少冗余计算,但是访问您必须自己计划。

上一张注意:如果您的分组更复杂,则任何解决方案都会有其他联接条件。例如,如果汇总查询也有一个ID上的子句组的组,则您现在需要一个内在的连接,而不是在主表中匹配ID。在域聚合函数的情况下,您需要指定em 标准参数,该参数指的是表字段值。关键是以上示例并不是所有情况的精确模板。

最新更新