I know I’m just making a simple error somewhere, but I can’t figure it out. I’m sure this is beyond easy.
I have a table with user ids, names, and a profile. I’m trying to count the number of users with each profile, and group them by the profile. Below is a sample of fake data.
This is the kind of output I’m looking for:
Below are a few simplified versions of what I tried so far:
select UserID, Name, Profile
from test_db
group by profile
Another attempt:
select UserID, Name, Profile, count(Profile)
from test_db
group by profile, UserID, Name
Neither give me what I’m looking for. I just get a long list of rows and for the count they just all have a 1 by them. I know I’m making it harder than it needs to be.
Thanks in advance!
Advertisement
Answer
Use ROW_NUMBER()
and COUNT()
window functions:
SELECT CASE WHEN t.rn = 1 THEN t.Profile END Profile,
CASE WHEN t.rn = 1 THEN t.counter END counter,
t.User_ID,
t.Name
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Profile ORDER BY Name) rn,
COUNT(*) OVER (PARTITION BY Profile) counter
FROM tablename t
) t
ORDER BY t.Profile, t.rn
I used the column Name
to sort the rows in each Profile
, but you can use any other column by making the change inside the OVER
clause of ROW_NUMBER()
.