在 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 活动或列表查找已清理/退回的电子邮件地址