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

前端之家收集整理的这篇文章主要介绍了sql – Oracle Analytic函数 – 重置窗口子句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下数据集.
  1. create table t1 (
  2. dept number,date1 date
  3. );
  4.  
  5. Table created.
  6.  
  7. insert into t1 values (100,'01-jan-2013');
  8. insert into t1 values (100,'02-jan-2013');
  9. insert into t1 values (200,'03-jan-2013');
  10. insert into t1 values (100,'04-jan-2013');
  11. commit;

我的目标是创建一个排名列,每次更改部门时都会重置.我可以用于“partition by”子句的最接近的列是dept,但这不会给我想要的结果.

  1. sql> select * from t1;
  2.  
  3. DEPT DATE1
  4. ---------- ---------
  5. 100 01-JAN-13
  6. 100 02-JAN-13
  7. 200 03-JAN-13
  8. 100 04-JAN-13
  9.  
  10. select dept,date1,rank () Over (partition by dept order by date1) rnk
  11. from t1
  12. order by date1;
  13.  
  14. DEPT DATE1 RNK
  15. ---------- --------- ----------
  16. 100 01-JAN-13 1
  17. 100 02-JAN-13 2
  18. 200 03-JAN-13 1
  19. 100 04-JAN-13 3

期望的输出如下.最后一个rnk = 1是因为Jan-04记录是变更后的第一个记录.

  1. DEPT DATE1 RNK
  2. ---------- --------- ----------
  3. 100 01-JAN-13 1
  4. 100 02-JAN-13 2
  5. 200 03-JAN-13 1
  6. 100 04-JAN-13 1 <<<----------

有什么指针吗?

解决方法

这有点复杂.而不是使用rank()等,使用lag()来查看某些内容何时发生变化.然后做一个标志的累积和.
  1. select dept,CASE WHEN StartFlag = 0 THEN 1
  2. ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
  3. END as rnk
  4. from (select t1.*,(case when dept = lag(dept) over (order by date1)
  5. then 1
  6. else 0
  7. end) as StartFlag
  8. from t1
  9. ) t1
  10. order by date1;

HeresqlFiddle.

编辑:

这是戈登编辑我自己的答案.哎呀.原始查询是90%的方式.它确定了数字应该增加的组,但没有分配组内的数字.我会用另一个row_number()级别执行此操作,如下所示:

  1. select dept,row_number() over (partition by dept,grp order by date1) as rnk
  2. from (select dept,startflag,sum(StartFlag) over (partition by dept order by date1) as grp
  3. from (select t1.*,(case when dept = lag(dept) over (order by date1)
  4. then 0
  5. else 1
  6. end) as StartFlag
  7. from t1
  8. ) t1
  9. ) t1
  10. order by date1;

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

猜你在找的MsSQL相关文章