SQL根据组百分比将用户选择到组中

时间:2018-01-08 23:48:48

标签: tsql sql-server-2008-r2

为了保持这一点,我们假设我有一张包含100条记录的表格,包括:

  • 用户id
  • pointsEarned

我想将这100条记录(或任何总数基于其他标准的记录)分组为若干组,如下所示:

  • 第1组,占总记录的15%
  • 第2组,占总记录的25%
  • 第3组,占总记录的10%
  • 第4组,占总记录的10%
  • 第5组,40%(总记录剩余,百分比并不重要)

除上述内容外,最少有3组,最多5组不同的百分比总是100%。如果它更容易,最后一组将始终是未在其他组中挑选的剩余部分。

我希望结果如下:

  • groupNbr
  • 用户id
  • pointsEarned

1 个答案:

答案 0 :(得分:1)

要做这种分解,你需要一种方法来对记录进行排名,以便你可以决定它们属于哪个组。如果你不想随机化组分配,而userId是连续的数字,那么使用userId会足够了。但是,您可能无法保证,因此您需要创建某种排名,然后使用它将数据拆分为组。这是一个简单的例子。

Declare @Total int
Set @Total = Select COUNT(*) from dataTable
Select case 
    when ranking <= 0.15 * @Total then 1
    when ranking <= 0.4 * @Total then 2
    when ranking <= 0.5 * @Total  then 3
    when ranking <= 0.6 * @Total  then 4
    else 5 end as groupNbr,
    userId,
    pointsEearned

FROM (Select userId, pointsEarned, ROW_NUMBER() OVER (ORDER BY userId) as ranking From dataTable) A

如果您需要随机确定哪个组数据最终,则需要先为每一行分配一个随机数,然后按该随机数对它们进行排名,然后按上述方式进行拆分。

如果你需要使分割更灵活,你可以设计一个分割表,其中包含minPercentage,maxPercentage,groupNbr等列,用分割填充它并执行类似的操作

Declare @Total int
Set @Total = Select COUNT(*) from dataTable
Select S.groupNbr
    B.userId,
    B.pointsEearned

FROM (Select ranking / @Total * 100 as rankPercent, userId, pointsEarned
    FROM (Select userId, pointsEarned, ROW_NUMBER() OVER (ORDER BY userId) as ranking From dataTable) A
    ) B
    inner join splitTable S on S.minPercentage <= rankPercent and S.maxPercentage >= rankPercent