首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle分析函数-重置窗口子句

Oracle分析函数-重置窗口子句
EN

Stack Overflow用户
提问于 2013-07-24 02:53:56
回答 3查看 2.6K关注 0票数 5

我有以下数据集。

代码语言:javascript
运行
复制
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,但这不会给我想要的结果。

代码语言:javascript
运行
复制
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年的记录是变化后的第一个记录.

代码语言:javascript
运行
复制
      DEPT DATE1            RNK
---------- --------- ----------
       100 01-JAN-13          1
       100 02-JAN-13          2
       200 03-JAN-13          1
       100 04-JAN-13          1  <<<----------

有什么指示吗?

EN

Stack Overflow用户

发布于 2013-07-24 07:13:23

这可能是model子句的情况,但不幸的是,与Gordon的查询相比,它在大量行上的性能明显差。

代码语言:javascript
运行
复制
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

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17824432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档