这有点复杂。而不是使用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;
编辑:
这是戈登在编辑我自己的答案。哎呀。原始查询的查询率为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()
。