sqloracle-databasebuckets

How to find number of distinct phones per customer and put the customers(counts) in different buckets as per the counts?


Below is the table where I have customer_id and different phones they have.

customer_id     phone_number
101            123456789
102            234567891
103            345678912
102            456789123
101            567891234
104            678912345
105            789123456
106            891234567
106            912345678
106            456457234
101            655435664
107            453426782

Now, I want to find customer_id and distinct phone number count.
So I used this query:

select distinct customer_id ,count(distinct phone_number)
from customer_phone;

customer_id   no of phones
101            3
102            2
103            1
104            1
105            1
106            3
107            1

And, from the above table my final goal is to achieve the below output which takes the counts and puts in different buckets and then count number of consumers that fall in those buckets.

Buckets no of consumers
3         2
2         1
1         4

There are close to 200 million records. Can you please explain an efficient way to work on this?


Solution

  • Use two aggregations:

    select cnt, count(*), min(customer_id), max(customer_id)
    from (select customer_id, count(distinct phone_number) as cnt
          from customer_phone
          group by customer_id
         ) c
    group by cnt
    order by cnt;