我试图根据多个不同的标准给不同城市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”列的中间步骤的情况下创建乐谱,那么这也很棒。 `
答案 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]
希望这有帮助