Чтобы выяснить это, вам нужно подсчитать количество транзакций на одну кредитную карту, чтобы определить правильное ведро, а затем вам нужно сосчитать количество кредитных карт на ведро в год. Есть несколько способов получить конечный результат. Один из способов - сначала объединить все ваши данные и вычислить первый уровень совокупных значений. Затем вычислите конечный уровень совокупных значений:
with t1 as (
select year_opened
, c.credit_card_id
, case when count(*) < 10 then 'Less than 10'
when count(*) < 30 then 'Between [10 and 30)'
else 'Greater than or equal to 30'
end buckets
from credit_cards c
join transactions t
on t.credit_card_id = c.credit_card_id
where t.transaction_status = 'complete'
group by year_opened
, c.credit_card_id
)
select count(*) credit_card_count
, year_opened
, buckets
from t1
group by year_opened
, buckets;
Тем не менее, может быть целесообразнее сначала вычислить первый уровень агрегированных данных в таблице транзакций, прежде чем присоединять их к таблице кредитных карт:
select count(*) credit_card_count
, year_opened
, buckets
from credit_cards c
join (select credit_card_id
, case when count(*) < 10 then 'Less than 10'
when count(*) < 30 then 'Between [10 and 30)'
else 'Greater than or equal to 30'
end buckets
from transactions
group by credit_card_id) t
on t.credit_card_id = c.credit_card_id
group by year_opened
, buckets;
Если вы предпочитаете развернуть вышеупомянутый запрос и используете Common Table Expressions, вы можете сделать это тоже (мне проще читать / следовать):
with bkt as (
select credit_card_id
, case when count(*) < 10 then 'Less than 10'
when count(*) < 30 then 'Between [10 and 30)'
else 'Greater than or equal to 30'
end buckets
from transactions
group by credit_card_id
)
select count(*) credit_card_count
, year_opened
, buckets
from credit_cards c
join bkt t
on t.credit_card_id = c.credit_card_id
group by year_opened
, buckets;