我有多个表,其中包含公司/属性的名称和排名。
我想写一段代码,允许根据与分数总分相关的分数百分位数将一系列分数放入特定的组。我提供了一个非常简单的用例来演示我正在寻找的内容,将一组10家公司分成5组,但我想扩展这个以便将5组应用于包含许多行的数据集而无需指定值在CASE声明中。
答案 0 :(得分:4)
您可以使用NTILE
根据得分将数据划分为5个存储桶。但是,如果数据不能分成相同数量的箱子或者有关系,则其中一个组将有更多成员。
SELECT t.*, NTILE(5) OVER(ORDER BY score) as grp
FROM tablename t
答案 1 :(得分:3)
~
实际上可能会将具有相同值的行放入不同的分位数中(这可能不是您想要的,至少我从不喜欢它)。
与
非常相似length
但如果行数不能均匀划分,则在使用NTILE(5) OVER(ORDER BY score)
时随机行添加到第一个分位数,并随机添加5 * (row_number() over (order by score) - 1) / count(*) over ()
。
要将具有相同值的所有行分配给相同的分位数,您需要进行自己的计算:
NTILE
答案 2 :(得分:2)
您可以尝试使用ROW_NUMBER()
和CEILING()
:
SELECT t.name,t.score,
CEILING(ROW_NUMBER() OVER(ORDER BY t.score)/2) as group
FROM YourTable t
这会使用ROW_NUMBER()
结果将每组两个分成一个组。