Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找ORACLE中帐户的活动天数_Sql_Oracle_Datetime_Gaps And Islands_Date Arithmetic - Fatal编程技术网

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

非常好的算法进行聚合。非常感谢你!