Он по-прежнему показывает значение 1-й, 3-й и 5-й строк - поэтому количество строк при каждой встрече с этими строками является правильным. Это номер строки во всем наборе результатов, а не в ненулевых значениях. Ваше выражение case решает, показывать ли значение, не влияя на то, как оно найдено.
Вы можете получить желаемый результат, используя dense_rank()
вместо
with your_table (Acctid, Transaction, PostDate, NetworkCd) as (
select 12345, 'Withdrawal', to_date('10/4/2018', 'MM/DD/YYYY'), 'FRGN' from dual
union all select 12345, 'Fee', to_date('10/4/2018', 'MM/DD/YYYY'), null from dual
union all select 12345, 'Withdrawal', to_date('10/11/2018', 'MM/DD/YYYY'), 'FRGN' from dual
union all select 12345, 'Fee', to_date('10/11/2018', 'MM/DD/YYYY'), null from dual
union all select 12345, 'Withdrawal', to_date('10/22/2018', 'MM/DD/YYYY'), 'FRGN' from dual
union all select 12345, 'Fee', to_date('10/22/2018', 'MM/DD/YYYY'), null from dual
)
select Acctid, Transaction, PostDate, NetworkCd,
(case when networkcd is not null then dense_rank() over (partition by acctid order by postdate) end) as periodcount
from your_table;
ACCTID TRANSACTIO POSTDATE NETW PERIODCOUNT
---------- ---------- ---------- ---- -----------
12345 Withdrawal 2018-10-04 FRGN 1
12345 Fee 2018-10-04
12345 Withdrawal 2018-10-11 FRGN 2
12345 Fee 2018-10-11
12345 Withdrawal 2018-10-22 FRGN 3
12345 Fee 2018-10-22
... поскольку это подавляет пробелы в сгенерированных значениях. Из документов :
DENSE_RANK
вычисляет ранг строки в упорядоченной группе строк и возвращает ранг как NUMBER
. Ранги - это последовательные целые числа, начинающиеся с 1. ...