Сначала нужно найти 7 диапазонов GROUPID, например, использовать этот иерархический запрос:
with ranges(amt, cn, g1, g2, mxg) as (
select amount, customer_number, min(groupid), min(groupid) + 6, max(groupid)
from data group by amount, customer_number union all
select amt, cn, g1 + 7, g2 + 7, mxg from ranges where g1 + 7 <= mxg)
select amt, cn, g1, g2, mxg from ranges
, который дает нам нижний и верхний предел каждого диапазона (G1, G2):
AMT CN G1 G2
----- ---------- ---------- ----------
1000+ 5555 51 57
1000+ 5555 58 64
2000+ 6666 55 61
Теперь мы можем объединить эти диапазоны с вашими данными, считать условно и рассчитывать суммы:
with ranges(amt, cn, g1, g2, mxg) as (
select amount, customer_number, min(groupid), min(groupid) + 6, max(groupid)
from data group by amount, customer_number union all
select amt, cn, g1 + 7, g2 + 7, mxg from ranges where g1 + 7 <= mxg)
select amt, cn, sum(cs) cnt
from (
select amt, cn, g1, g2, case when max(seqf) >= 2 then 1 end cs
from ranges
join data on amt = amount and cn = customer_number
and groupid between g1 and g2
group by amt, cn, g1, g2)
group by amt, cn
Демо-версия dbfiddle
Я использовал max(seqf)
, потому что ваши слова IF SEQF> = 2 в 1-й группе в любом из GROUPID предполагают это. Если вы хотите получить первое значение в этой группе, например, используйте min ... keep dense rank first
.
Вы также можете вычесть groupid и минимальный groupid для каждого (сумма, customer_number), разделить на 7, использовать floor, и это будет создавать группы, это будет быстрее:
select amount, customer_number, sum(seqf)
from (
select amount, customer_number, case when max(seqf) >= 2 then 1 end seqf
from (
select data.*,
floor((groupid - min(groupid) over (partition by amount, customer_number))/7) gid
from data)
group by amount, customer_number, gid)
group by amount, customer_number