Reputation: 465
I have a table with diagnosecodes on my sql server. On several days some diagnoses are set and pushed in the table.
Table (diagnoses) looks like this: Diagnose, Diagnosecode, Date.
What im trying to output with sql is: The top 5 most occurred diagnosecode's on certain days (from X days till now) like this:
10 sept 2015 :
100 times 1157 (diagnosecode)
90 times 11337 (diagnosecode)
80 times 111237 (diagnosecode)
70 times 112312357 (diagnosecode)
60 times 1112317 (diagnosecode)
9 sept 2015 :
100 times 1157 (diagnosecode)
90 times 11337 (diagnosecode)
80 times 111237 (diagnosecode)
70 times 112312357 (diagnosecode)
60 times 1112317 (diagnosecode)
8 sept 2015 :
100 times 1157 (diagnosecode)
90 times 11337 (diagnosecode)
80 times 111237 (diagnosecode)
70 times 112312357 (diagnosecode)
60 times 1112317 (diagnosecode)
I tried this:
SELECT TOP(5) count([diagnosecode]) as occurences, diagnosecode,
FROM diagnoses
WHERE date = SYSDATETIME()
GROUP BY diagnosecode
ORDER BY date DESC, COUNT([diagnosecode]) DESC
It only works for today. I dont know how to make the query work for multiple days. How would I approach this issue?
Upvotes: 2
Views: 959
Reputation: 1270573
If you want five on each day, then use window functions:
SELECT date, occurrences, diagnosecode,
FROM (SELECT diagnosecode, date, COUNT(*) as occurrences,
ROW_NUMBER() OVER (PARTITION BY date ORDER BY COUNT(*) DESC) as seqnum
FROM diagnoses
GROUP BY diagnoses, date
) dd
WHERE seqnum <= 5
ORDER BY date DESC, occurrences DESC;
Note: if the date really has a time component, then you will want to cast it to date
to extract only the date portion.
Upvotes: 6
Reputation: 795
Remove the where clause
SELECT TOP(5) count([diagnosecode]) as occurences, diagnosecode,
FROM diagnoses
GROUP BY diagnosecode
ORDER BY date DESC, COUNT([diagnosecode]) DESC
Upvotes: 0