Counting number of orders per unique person

Is there a more elegant way to perform calculations of total number of orders per person?
My dataset contains a list of people , date when order was placed, order method, product description. I don’t have an unique order id column (which would make my life easier). I have 1 order per row.
In my sql code i assign a row number to each order in 1rst nested query, then I count max number of orders per person in the 2nd nested query.
At the end, I perform calculations to see how many people placed 1 order only, 2 orders only, etc.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>select distinct
max_nbr_of_devices_ordered
, count(distinct prsn_id) as numer
from ( select distinct
prsn_id
, max(nbr_of_devices_ordered) as max_nbr_of_devices_ordered
from ( select distinct
prsn_id
, Row_Number() Over (PARTITION BY prsn_id ORDER BY order_date, product_desc ASC) AS nbr_of_devices_ordered
from hsd_orders
) as a
group by 1
) as b
group by 1
</code>
<code>select distinct max_nbr_of_devices_ordered , count(distinct prsn_id) as numer from ( select distinct prsn_id , max(nbr_of_devices_ordered) as max_nbr_of_devices_ordered from ( select distinct prsn_id , Row_Number() Over (PARTITION BY prsn_id ORDER BY order_date, product_desc ASC) AS nbr_of_devices_ordered from hsd_orders ) as a group by 1 ) as b group by 1 </code>
select distinct
max_nbr_of_devices_ordered
, count(distinct prsn_id) as numer
from ( select distinct
        prsn_id
        , max(nbr_of_devices_ordered) as max_nbr_of_devices_ordered
        from ( select distinct
               prsn_id
               , Row_Number() Over (PARTITION BY prsn_id ORDER BY order_date, product_desc ASC) AS nbr_of_devices_ordered
               from hsd_orders
               ) as a
        group by 1
        ) as b
group by 1

2

this answer provided by Andrew worked:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>select
order_count
, count(distinct prsn_id) as numer
from (select distinct prsn_id, count (*) as order_count from hsd_orders group by prsn_id) T
group by 1
</code>
<code>select order_count , count(distinct prsn_id) as numer from (select distinct prsn_id, count (*) as order_count from hsd_orders group by prsn_id) T group by 1 </code>
select 
order_count
, count(distinct prsn_id) as numer
from (select distinct prsn_id, count (*) as order_count from hsd_orders group by prsn_id)  T 
group by 1 

2

As noted in comments the distincts can be dropped as they are not doing any work here:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>select
order_count
,count(prsn_id) as numer
from (select prsn_id, count (*) as order_count from hsd_orders group by 1)
group by 1
</code>
<code>select order_count ,count(prsn_id) as numer from (select prsn_id, count (*) as order_count from hsd_orders group by 1) group by 1 </code>
select 
  order_count
  ,count(prsn_id) as numer
from (select prsn_id, count (*) as order_count from hsd_orders group by 1) 
group by 1 

works thus for some fake data:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>with hsd_orders(ord_id, prsn_id, date) as (
select * from values
(1, 1, '2024-09-25'),
(2, 2, '2024-09-25'),
(3, 2, '2024-09-26'),
(4, 3, '2024-09-25'),
(5, 3, '2024-09-26'),
(6, 3, '2024-09-26'),
(7, 4, '2024-09-26'),
(8, 4, '2024-09-25')
)
select
order_count
,count(prsn_id) as numer
from (select prsn_id, count (*) as order_count from hsd_orders group by 1)
group by 1
</code>
<code>with hsd_orders(ord_id, prsn_id, date) as ( select * from values (1, 1, '2024-09-25'), (2, 2, '2024-09-25'), (3, 2, '2024-09-26'), (4, 3, '2024-09-25'), (5, 3, '2024-09-26'), (6, 3, '2024-09-26'), (7, 4, '2024-09-26'), (8, 4, '2024-09-25') ) select order_count ,count(prsn_id) as numer from (select prsn_id, count (*) as order_count from hsd_orders group by 1) group by 1 </code>
with hsd_orders(ord_id, prsn_id, date) as (
    select * from values
    (1, 1, '2024-09-25'),
    (2, 2, '2024-09-25'),
    (3, 2, '2024-09-26'),
    (4, 3, '2024-09-25'),
    (5, 3, '2024-09-26'),
    (6, 3, '2024-09-26'),
    (7, 4, '2024-09-26'),
    (8, 4, '2024-09-25')
)
select 
  order_count
  ,count(prsn_id) as numer
from (select prsn_id, count (*) as order_count from hsd_orders group by 1) 
group by 1 

we get:

ORDER_COUNT NUMER
1 1
2 2
3 1

But it can be more simpler, because we are not using the person id’s we do not need to carry them, just to throw them away.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>select
order_count
,count(1) as numer
from (
select count (*) as order_count
from hsd_orders
group by prsn_id
)
group by 1
</code>
<code>select order_count ,count(1) as numer from ( select count (*) as order_count from hsd_orders group by prsn_id ) group by 1 </code>
select 
  order_count
  ,count(1) as numer
from (
  select count (*) as order_count 
  from hsd_orders 
  group by prsn_id
) 
group by 1 

If you really want to avoid a subquery

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>select distinct
count(*) as num_orders,
count(prsn_id) over (partition by num_orders) as num_people
from hsd_orders
group by prsn_id
order by num_orders;
</code>
<code>select distinct count(*) as num_orders, count(prsn_id) over (partition by num_orders) as num_people from hsd_orders group by prsn_id order by num_orders; </code>
select distinct 
       count(*) as num_orders, 
       count(prsn_id) over (partition by num_orders) as num_people
from hsd_orders 
group by prsn_id
order by num_orders;

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật