请教各位如何在storeprocedure中实现 “比较通过则给通过的数据行以及之前的行 某列赋值 否则继续比较”

一.题目与数据

题目如下:
在行业中, 对医院有一种按照潜力来判断医院是否具有值得重点开发的方法,这种方法最后会赋予医院一个属性–Decile.Decile的取值范围是1-10,潜力金额越大,Decile值越小。
计算规则为:对所有医院的潜力进行倒序排列, 累计潜力达到全国潜力总量10%(含10%)的第一组医院,标记为Decile 1; 累计潜力达到全国潜力总量20%(含20%)的除去已标记为Decile 1的医院, 标记为Decile 2;累计潜力达到全国潜力总量30%(含30%)的除去已标记为Decile 1、2的医院, 标记为Decile 3;剩下的依次类推,计算完Decile 9之后剩下的医院为Decile 10。
请用算法实现医院Decile的计算。

数据如下:
| 表名: Potential | |
| HospitalName | Potential |
| HP1 | 1000 |
| HP2 | 2500 |
| HP3 | 2700 |
| HP4 | 3000 |
| HP5 | 50 |
| HP6 | 215 |
| HP7 | 2410 |
| HP8 | 1292 |
| HP9 | 1031 |
| HP10 | 951 |
| HP11 | 278 |
| HP12 | 13 |
| HP13 | 706 |
| HP14 | 180 |
| HP15 | 970 |
| HP16 | 572 |
| HP17 | 650 |
| HP18 | 1598 |
| HP19 | 790 |
| HP20 | 605 |
| HP21 | 302 |
| HP22 | 697 |
| HP23 | 1240 |
| HP24 | 191 |
| HP25 | 278 |
| HP26 | 795 |
| HP27 | 795 |
| HP28 | 145 |
| HP29 | 808 |
| HP30 | 198 |
| HP31 | 787 |
| HP32 | 918 |
| HP33 | 1603 |

二.需求解读

首先根据potential进行降序排列。
计算出从上至下的累计潜力,记为sump。
然后计算所有医院潜力总量。
用累计潜力与10%潜力总量比较,至某行累计潜力大于10%潜力总量时,该行与前列行视为第一组,标记为Decile 1。
然后继续用下行累计潜力与20%潜力总量比较,至某行累计潜力大于20%潜力总量时,该行与前列除了已标记为Decile 1的行视为第二组,标记为Decile 2。
依次比较至标记decile 9。剩余的标记为Decile 10。

三.编写

以下是已完成的编写:

CREATE DEFINER=`root`@`localhost` PROCEDURE `mark_decile`()
BEGIN

    set @gp = (select sum(potential) from potential);

    select a.hosname, a.potential, o.sump, a.decile 
    from potential a 
    left join 
    (SELECT p1.hosname, (select sum(p2.potential) from potential p2 where p2.potential >= p1.potential) sump FROM potential p1 order by potential desc) o 
    on o.hosname = a. hosname 
    order by potential desc;    

END

实现了potential的降序排列与累计潜力的计算。

四.问题

目前想不出来如何编写 某行累计潜力比较通过后,标记一组同时避免覆盖上一组标记 的语言
请教各位前辈,实现类似的功能应该采用什么语句?
如果有类似的案例经验可以学习,烦请指路。
非常感谢您的阅读与帮助。

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!