如何基于排序顺序百分位来分组/分数

时间:2014-11-19 03:57:48

标签: mysql sql

我试图根据多个不同的标准给不同城市1到5分“得分”,最终将得分加起来,并决定哪个城市最好。

“international_tobacco_alcohol”表包含居民在酒精和烟草上花费的收入百分比值。我想将结果分为5个区,其中1是最低百分比,5是最高。

我添加了一个“sort_order”列

ALTER TABLE international_tobacco_alcohol ADD COLUMN sort_order INT DEFAULT NULL;

SET @x = 0;
UPDATE international_tobacco_alcohol SET sort_order = (@x:=@x+1) 
ORDER BY spent_on_alcohol_and_tobacco;
SELECT * FROM international_tobacco_alcohol;

然后我想添加“得分”列,但我不知道如何正确地做到这一点。我基本上试过了我能想到的每一个变化:

ALTER TABLE international_tobacco_alcohol ADD COLUMN score INT DEFAULT NULL;
UPDATE international_tobacco_alcohol 
SET score = CASE
        WHEN sort_order < .2*MAX(sort_order) THEN 1
        WHEN sort_order=> .2*MAX(sort_order)and <.4*MAX(sort_order) THEN 2
        WHEN sort_order=> .4*MAX(sort_order)and <.6*MAX(sort_order) THEN 3
        WHEN sort_order=> .6*MAX(sort_order)and <.8*MAX(sort_order) THEN 4
        WHEN sort_order=> .8*MAX(sort_order)and =<MAX(sort_order) THEN 5
        END;

我希望CASE WHEN子句与行总数成比例,而不是预定义的值,以便它可以重新训练并与新数据一起使用。

我感谢一些帮助。如果我可以在没有创建“sort_order”列的中间步骤的情况下创建乐谱,那么这也很棒。 `

1 个答案:

答案 0 :(得分:0)

您不需要[spent_on_alcohol_and_tobacco]的[sort_order]。 另一种方法是使用RANK()函数或DENSE_RANK();

我不知道列,但你可以这样做:

SELECT [col_1], [col_2]
    ,RANK() OVER 
    (PARTITION BY [Location] ORDER BY [spent_on_alcohol_and_tobacco] DESC) AS Rank
FROM [international_tobacco_alcohol]

希望这有帮助