我有以下数据集。
create table t1 (
dept number,
date1 date
);
Table created.
insert into t1 values (100, '01-jan-2013');
insert into t1 values (100, '02-jan-2013');
insert into t1 values (200, '03-jan-2013');
insert into t1 values (100, '04-jan-2013');
commit;
我的目标是创建一个级别列,在部门每次更改时重新设置。对于"partition“子句,我可以使用的最接近的列是dept,但这不会给我想要的结果。
SQL> select * from t1;
DEPT DATE1
---------- ---------
100 01-JAN-13
100 02-JAN-13
200 03-JAN-13
100 04-JAN-13
select dept,
date1,
rank () Over (partition by dept order by date1) rnk
from t1
order by date1;
DEPT DATE1 RNK
---------- --------- ----------
100 01-JAN-13 1
100 02-JAN-13 2
200 03-JAN-13 1
100 04-JAN-13 3
所需的输出如下。最后一个rnk=1是因为1月-04年的记录是变化后的第一个记录.
DEPT DATE1 RNK
---------- --------- ----------
100 01-JAN-13 1
100 02-JAN-13 2
200 03-JAN-13 1
100 04-JAN-13 1 <<<----------
有什么指示吗?
发布于 2013-07-24 07:13:23
这可能是model
子句的情况,但不幸的是,与Gordon的查询相比,它在大量行上的性能明显差。
select dept, date1, rank from t1
model
dimension by ( row_number() over(order by date1) as rn )
measures( 1 as rank, dept, date1 )
rules (
rank[1] = 1,
rank[rn > 1] =
case dept[cv()]
when dept[cv()-1] then rank[cv()-1] + 1
else 1
end
)
http://www.sqlfiddle.com/#!4/fc339/132
https://stackoverflow.com/questions/17824432
复制相似问题