您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Oracle Analytic函数-重置窗口条款

Oracle Analytic函数-重置窗口条款

这有点复杂。而不是使用rank()或类似方法,而是使用lag()来查看何时发生了更改。然后对标志进行累加和。

select dept, date1,
       CASE WHEN StartFlag = 0 THEN 1
            ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
       END as rnk
from (select t1.*,
             (case when dept = lag(dept) over (order by date1)
                   then 1
                   else 0
              end) as StartFlag
      from t1
     ) t1
order by date1;

sqlfiddle

编辑:

这是戈登在编辑我自己的答案。哎呀。原始查询查询率为90%。它确定的 群体 ,其中的数字应该增加,但并没有在组内分配的编号。我将在另一个层次上执行此操作,row_number()例如:

select dept, date1,
       row_number() over (partition by dept, grp order by date1) as rnk
from (select dept, date1, startflag,
             sum(StartFlag) over (partition by dept order by date1) as grp
      from (select t1.*,
                   (case when dept = lag(dept) over (order by date1)
                         then 0
                         else 1
                    end) as StartFlag
            from t1
           ) t1
     ) t1
order by date1;

因此,总体思路如下。首次用于lag()确定组的开始位置(即,从一个日期到下一个日期的部门发生变化的位置)。然后,通过累加总和为这些分配一个“组ID”。这些是要枚举的记录。最后一步是使用枚举它们row_number()

Oracle 2022/1/1 18:42:11 有506人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶