首页 > 解决方案 > Oracle:按条件排序并保留历史记录

问题描述

我有这个示例表:

在此处输入图像描述

我需要创建一个排名列,它将根据 is_true=1 对 id 进行排序,这意味着 is_true 从 0 到 1 的每次更改都会将索引增加 1。如下所示:

在此处输入图像描述

我试过类似的东西:

select id, customer_id, is_true,  
       rank() over (partition by customer_id order by (case when is_true=1 then id end)) index_rank 
from table

但它没有提供我需要的东西。

任何帮助都感激不尽。

标签: sqloraclewindow-functions

解决方案


你可以做一个窗口总和:

select
    t.*,
    1 + sum(is_true) over(partition by cutsomer_id order by id) index_rank
from mytable t

如果你想允许连续1的 s 而不增加排名,那么你可以lag()先使用:

select
    t.*,
    1 + sum(case when is_true = 1 and lag_is_true = 0 then 1 else 0 end) 
        over(partition by cutsomer_id order by id) index_rank
from (
    select 
        t.*,
        lag(is_true) over(partition by cutsomer_id order by id) lag_is_true
    from mytable t
) t

推荐阅读