Oracle 查询继续查找直到值不再为 0

Oracle query to keep looking until value is not 0 anymore

我正在使用 Oracle 11。 我有2张桌子

TblA 列 id,entity_id 和 effective_date。 带有列 id 和值的 TblADetail。 如果生效日期的值 = 0,我想继续寻找下一个生效日期,直到找到值 <> 0 为止。

以下查询仅查找 21 年 3 月 10 日的值。 如果值 = 0,我想查找 21 年 3 月 11 日的值。如果那不是 0,我想停止。 但是,如果那是 0,我想寻找 21 年 3 月 12 日的价值。如果那不是 0,我想停止。 但是,如果那是 0,我想继续寻找直到值不为 0。 我该怎么做?

SELECT SUM(pd.VALUE) 
FROM TblA p,TblADetail pd
WHERE     p.id = pd.id
AND p.effective_date = to_date('03/10/2021','MM/DD/YYYY')
AND TRIM (p.entity_id) = 123

示例数据: TblA

id   entity_id effective_date
1    123       3/10/21
2    123       3/11/21
3    123       3/12/21 

TblADetail

id value
1  -136
1  136
2  2000
3  3000

在上面的数据中,对于 entity_id 123,从 effective_date 3/10/21 开始,我想 return 值 2000(来自 TblADetail)effective_date 3/11/21.

因此,从某个日期开始,我想要具有非零值的最小日期的结果。

谢谢。

直截了当;阅读代码中的注释。第 1 - 13 行中的示例数据,查询从第 14 行开始。

SQL> with
  2  -- sample data
  3  tbla (id, entity_id, effective_date) as
  4    (select 1, 123, date '2021-03-10' from dual union all
  5     select 2, 123, date '2021-03-11' from dual union all
  6     select 3, 123, date '2021-03-12' from dual
  7    ),
  8  tblb (id, value) as
  9    (select 1, -136 from dual union all
 10     select 1,  136 from dual union all
 11     select 2, 2000 from dual union all
 12     select 3, 3000 from dual
 13    ),
 14  tblb_temp as
 15    -- simple grouping per ID
 16    (select id, sum(value) value
 17     from tblb
 18     group by id
 19    )
 20  -- return TBLA values whose ID equals TBLB_TEMP's minimum ID
 21  -- whose value isn't zero
 22  select a.id, a.entity_id, a.effective_date
 23  from tbla a
 24  where a.id = (select min(b.id)
 25                from tblb_temp b
 26                where b.value > 0
 27               );

        ID  ENTITY_ID EFFECTIVE_
---------- ---------- ----------
         2        123 03/11/2021

SQL>

您可以按照生效日期对总和进行分组,然后使用 MIN 分析函数查找最早日期来完成您需要做的事情。完成后,您只需 select 匹配最早日期的日期。

例如:

with     tbla as (select 1 id, ' 123' entity_id, to_date('10/03/2021', 'dd/mm/yyyy') effective_date from dual union all
                  select 2 id, ' 123' entity_id, to_date('11/03/2021', 'dd/mm/yyyy') effective_date from dual union all
                  select 3 id, ' 123' entity_id, to_date('12/03/2021', 'dd/mm/yyyy') effective_date from dual),
  tbla_detail as (select 1 id, -136 value from dual union all
                  select 1 id,  136 value from dual union all
                  select 2 id, 2000 value from dual union all
                  select 3 id, 3000 value from dual),
      results as (select a.effective_date,
                         sum(ad.value) sum_value,
                         min(case when sum(ad.value) != 0 then a.effective_date end) over () min_effective_date
                  from   tbla a
                         inner join tbla_detail ad on a.id = ad.id
                  where  a.effective_date >= to_date('10/03/2021', 'dd/mm/yyyy')
                  and    trim(a.entity_id) = '123'
                  group by a.effective_date)
select sum_value
from   results
where  effective_date = min_effective_date;

 SUM_VALUE
----------
      2000