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
您可以尝试使用 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 ()
我有多个表,其中包含 company/attribute 的名称和排名。
我想编写一段代码,允许根据分数与表格总分的关系将一定范围的分数放入特定的组中。我提供了一个非常简单的用例来演示我在寻找什么,将 10 家公司分成 5 组,但我想对其进行缩放,以便将这 5 组应用于多行数据集而无需指定值在 CASE 语句中。
您可以使用NTILE
根据分数将数据分成5个桶。但是,如果数据不能分成相等数量的 bin,或者如果有联系,其中一个组将有更多成员。
SELECT t.*, NTILE(5) OVER(ORDER BY score) as grp
FROM tablename t
您可以尝试使用 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 ()