gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:44:12 25 4
gpt4 key购买 nike

我有以下数据集。

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, 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;

Here是 SQLFiddle。

编辑:

这是戈登编辑我自己的答案。哎呀。原始查询已经完成了 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() 枚举它们。 .

关于sql - Oracle 分析函数 - 重置窗口子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com