首页 > 解决方案 > 基于分隔符行的增量值

问题描述

我希望能够在达到“分隔符行”时增加一个值。

举个例子; 零是分隔符行。

GROUP_ID
--------
1
1
1
0 
1
1
0
1
1
1

我想要的是:

GROUP_ID
--------
1
1
1
0 
2
2
0
3
3
3

当然,也可能存在异常情况,例如从零开始或连续的零。我认为 NTILE 可能很有用,因为它有类似的创建存储桶的想法。

select START_DATE, END_DATE, DTEDIF, GROUP_ID
  FROM (select START_DATE,
               END_DATE,
               DTEDIF,
               (CASE
                 WHEN DTEDIF <= 24 THEN
                  1
                 ELSE
                  0
               END) GROUP_ID

          FROM (select START_DATE,
                       END_DATE,
                       MONTHS_BETWEEN(END_DATE, START_DATE) as DTEDIF
                  from (select start_date,
                               LEAD(start_date, 1) OVER(order by start_date) as END_DATE
                          from (select sysdate start_date
                                  from dual
                                union all
                                select add_months(sysdate, 12) dt
                                  from dual --12
                                union all
                                select add_months(sysdate, 22) dt
                                  from dual --10
                                union all
                                select add_months(sysdate, 40) dt
                                  from dual --18
                                union all
                                select add_months(sysdate, 68) dt
                                  from dual --28
                                union all
                                select add_months(sysdate, 70) dt
                                  from dual --18
                                union all
                                select add_months(sysdate, 88) dt
                                  from dual --18
                                union all
                                select add_months(sysdate, 118) dt
                                  from dual --30
                                ))));

标签: sqloracle

解决方案


这是一种方法:计算每行之前的零数:

select t.*,
       (case when group_id = 0 then group_id
             else sum(case when group_id = 0 then 1 else 0 end) over (order by <ordering column>)
        end) as new_group_id
from t;

SQL 表表示无序集。所以你的问题需要一个单独的列来表示数据的顺序。


推荐阅读