在 ORACLE 中查找帐户的活动天数

Posted

技术标签:

【中文标题】在 ORACLE 中查找帐户的活动天数【英文标题】:Find number of days Active days for account in ORACLE 【发布时间】:2020-12-14 14:02:18 【问题描述】:

我正在尝试查找关闭特定帐户的天数。

我有如下表格:

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 结束。我需要找出孝顺结账的天数。 例如,对于 ACC 001,从 2020 年 11 月 2 日到 2020 年 11 月 4 日花了 2 天。对于 101 ACC,需要 11 天。因为从 2020-11-02 - 2020-11-03 -> 1 天, 从 2020-11-09 - 2020-11-19 -> 10 天 总共 13 天

我想要的结果:

----------------------------
CODE_FILIAL   | NUM_OF_DAYS
---------------------------
  00690       |  13

【问题讨论】:

【参考方案1】:

这听起来像是一个孤岛问题。一个岛以sum_in 中的0 值开始,并以saldo_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_filial, acc) 元组的列sum_in 中遇到0 的值时,该窗口总和就会递增。然后我们可以使用聚合来计算相应的结束日期。最后一步是通过code_filial聚合。

【讨论】:

非常好的算法。非常感谢!

以上是关于在 ORACLE 中查找帐户的活动天数的主要内容,如果未能解决你的问题,请参考以下文章

为 MailChimp 活动或列表查找已清理/退回的电子邮件地址

Oracle查询以查找活动状态记录的开始和结束日期

自上次活动以来经过的代码天数

尝试查找 Oracle SQL 中状态字段更改的最近日期

计算工作天数的公式,但不包括Google表格中的重叠天数或部分重叠天数

如何编写查询以将两个帐户及其活动日志合并为一个? [关闭]