加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql – Oracle Analytic函数 – 重置窗口子句

发布时间:2021-04-01 19:48:26 所属栏目:编程 来源:网络整理
导读:我有以下数据集. 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');

我有以下数据集.

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 by”子句的最靠近的列是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是由于Jan-04记录是改观后的第一个记录.

DEPT DATE1            RNK
---------- --------- ----------
       100 01-JAN-13          1
       100 02-JAN-13          2
       200 03-JAN-13          1
       100 04-JAN-13          1  <<<----------

有什么指针吗?

办理要领

这有点伟大.而不是行使rank()等,行使lag()来查察某些内容何时产生变革.然后做一个符号的累积和.
select dept,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;

Here是SQLFiddle.

编辑:

这是戈登编辑我本身的谜底.哎呀.原始查询是90%的方法.它确定了数字应该增进的组,但没有分派组内的数字.我会用另一个row_number()级别执行此操纵,如下所示:

select dept,row_number() over (partition by dept,grp order by date1) as rnk
from (select dept,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()列举它们.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读