SQL 到 select 用户根据群组百分比分组
SQL to select users into groups based on group percentage
为简单起见,假设我有一个包含 100 条记录的 table,其中包括:
- 用户名
- 获得积分
我想将这 100 条记录(或基于其他标准的总数)分成几组,如下所示:
- 第 1 组,占总记录的 15%
- 第 2 组,占总记录的 25%
- 第 3 组,占总记录的 10%
- 第 4 组,占总记录的 10%
- 第 5 组,40%(总记录的剩余部分,百分比并不重要)
除上述之外,还有最少 3 组和最多 5 组,百分比各不相同,总计为 100%。如果方便的话,最后一组将永远是其他组中未被选中的剩余部分。
我希望结果如下:
- groupNbr
- 用户名
- 获得积分
要进行这种分解,您需要一种对记录进行排序的方法,以便您可以决定它们属于哪个组。如果您不想随机分配组,并且 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
如果你需要随机化数据最终在哪一组,那么你需要先为每一行分配一个随机数,然后根据该随机数对它们进行排序,然后按上述方式拆分。
如果您需要使拆分更灵活,您可以设计一个拆分 table,其中包含 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
为简单起见,假设我有一个包含 100 条记录的 table,其中包括:
- 用户名
- 获得积分
我想将这 100 条记录(或基于其他标准的总数)分成几组,如下所示:
- 第 1 组,占总记录的 15%
- 第 2 组,占总记录的 25%
- 第 3 组,占总记录的 10%
- 第 4 组,占总记录的 10%
- 第 5 组,40%(总记录的剩余部分,百分比并不重要)
除上述之外,还有最少 3 组和最多 5 组,百分比各不相同,总计为 100%。如果方便的话,最后一组将永远是其他组中未被选中的剩余部分。
我希望结果如下:
- groupNbr
- 用户名
- 获得积分
要进行这种分解,您需要一种对记录进行排序的方法,以便您可以决定它们属于哪个组。如果您不想随机分配组,并且 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
如果你需要随机化数据最终在哪一组,那么你需要先为每一行分配一个随机数,然后根据该随机数对它们进行排序,然后按上述方式拆分。
如果您需要使拆分更灵活,您可以设计一个拆分 table,其中包含 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