Sql 查找ORACLE中帐户的活动天数
我正试图找到关闭特定帐户的天数 我有如下表格:Sql 查找ORACLE中帐户的活动天数,sql,oracle,datetime,gaps-and-islands,date-arithmetic,Sql,Oracle,Datetime,Gaps And Islands,Date Arithmetic,我正试图找到关闭特定帐户的天数 我有如下表格: OPER_DAY | CODE_FILIAL | SUM_IN | SALDO_OUT | ACC ------------------------------------------------------------------------------- 2020-11-02 | 00690 | 0 | 1578509367.58
OPER_DAY | CODE_FILIAL | SUM_IN | SALDO_OUT | ACC
-------------------------------------------------------------------------------
2020-11-02 | 00690 | 0 | 1578509367.58 | 001
2020-11-03 | 00690 | 1578509367.58 | 9116497.5 | 001
2020-11-04 | 00690 | 9116497.5 | 0 | 001
2020-11-02 | 00690 | 0 | 157430882.96 | 101
2020-11-03 | 00690 | 157430882.96 | 0 | 101
2020-11-09 | 00690 | 0 | 500000 | 101
2020-11-19 | 00690 | 500000 | 0 | 101
对于特定的ACC,一天以0和开始,以0结束。我需要找出“孝顺”关闭帐户所用的天数。
例如,对于ACC001,从2020-11-02-2020-11-04开始,需要2天的时间。101ACC需要11天的时间。因为从2020-11-02-2020-11-03->1天,
从2020-11-09-2020-11-19->10天
总体13天
我想要的结果是:
----------------------------
CODE_FILIAL | NUM_OF_DAYS
---------------------------
00690 | 13
这听起来像是一个缺口和孤岛问题。孤岛以
sum\u in
中的0
值开始,以saldo\u out中的0
值结束
假设每次启动最多有一个端点,您可以按如下方式使用窗口函数和聚合:
select code_filial, sum(end_dt - start_dt) as num_of_days
from (
select code_filial, acc, grp
min(oper_day) as start_dt,
max(case when saldo_out = 0 then oper_day end) as end_dt
from (
select t.*,
sum(case when sum_in = 0 then 1 else 0 end) over(partition by code_filial, acc order by oper_day) as grp
from mytable t
) t
group by code_filial, acc, grp
) group by code_filial
这是通过使用窗口总和构建记录组来实现的,对于给定的(code\u,acc)
元组,
中的列sum\u每次满足0
的值时,窗口总和都会递增。然后,我们可以使用聚合来计算相应的结束日期。最后一步是通过code\u
非常好的算法进行聚合。非常感谢你!