首页 > 解决方案 > 以最终状态条件排名

问题描述

ID  Initial_State   End_State   Date                  Rank
12345   B           EndState    22/08/2019 08:58    3
12345   EndState2          B    21/08/2019 08:58    3
12345   B          EndState2    20/08/2019 08:58    2
12345   EndState           B    19/08/2019 08:58    2
12345   B           EndState    18/08/2019 08:58    1
12345   A                  B    17/08/2019 08:58    1

在上表中,我正在尝试创建排名列。应根据国家分配等级。如果遇到任何结束状态,则秩必须更改并加 1。例如,一个 ID 可以有多个状态,但是当遇到结束状态时,其以下的所有转换都应视为秩一。

我正在使用 MYSQL

标签: mysqlsql

解决方案


您可以使用窗口函数来做到这一点。您可以将“结束状态”的数量计算到一行并加 1:

select t.*,
       coalesce(sum(case when End_State like 'EndState%' then 1 else 0 end) over
                    (partition by id
                     order by date
                     rows between unbounded preceding and 1 preceding
                    )
                   ), 0
                ) + 1 as rank
from t;

推荐阅读