SQL - 按 Percentile/Merge 排名对值进行分组

SQL - Group Values by Percentile/Merge Rankings

我有多个表,其中包含 company/attribute 的名称和排名。

我想编写一段代码,允许根据分数与表格总分的关系将一定范围的分数放入特定的组中。我提供了一个非常简单的用例来演示我在寻找什么,将 10 家公司分成 5 组,但我想对其进行缩放,以便将这 5 组应用于多行数据集而无需指定值在 CASE 语句中。

您可以使用NTILE根据分数将数据分成5个桶。但是,如果数据不能分成相等数量的 bin,或者如果有联系,其中一个组将有更多成员。

SELECT t.*, NTILE(5) OVER(ORDER BY score) as grp
FROM tablename t

Read more about NTILE here

您可以尝试使用 ROW_NUMBER()CEILING() :

SELECT t.name,t.score,
       CEILING(ROW_NUMBER() OVER(ORDER BY t.score)/2) as group
FROM YourTable t

这将使用 ROW_NUMBER() 结果将每组两人分成一组。

NTILE(5) OVER(ORDER BY score) 实际上可能会将具有相同值的行放入不同的分位数(这可能不是你想要的,至少我从来不喜欢那样)。

非常相似
5 * (row_number() over (order by score) - 1) / count(*) over ()

但如果行数不能均分,则在使用 NTILE 时将剩余行添加到第一个分位数,并随机用于 ROW_NUMBER

要将具有相同值的所有行分配给相同的分位数,您需要自己进行计算:

5 * (rank() over (order by score) - 1) / count(*) over ()