为了保持这一点,我们假设我有一张包含100条记录的表格,包括:
我想将这100条记录(或任何总数基于其他标准的记录)分组为若干组,如下所示:
除上述内容外,最少有3组,最多5组不同的百分比总是100%。如果它更容易,最后一组将始终是未在其他组中挑选的剩余部分。
我希望结果如下:
答案 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