I have trouble to get a output for group function in sql.Below are the details for table
I have 1 table table name "checks" have 2 columns pid,cid
Name Null? Type
----------------------------------------- -------- ----------------------------
PID VARCHAR2(20)
CID VARCHAR2(20)
Below are rows available
select * from checks;
PID CID
-------------------- --------------------
p1 c1
p1 c1
p1 c2
p1 c2
p1 c2
p2 c1
p2 c1
p2 c1
p2 c1
p2 c1
p2 c1
p2 c2
p2 c2
p2 c2
p2 c2
p2 c2
P represents participants and c represents category
I need to know which participant participate more than one category in that which category participant participate maximum.(for every participants)
Expected result:
pid cid count(cid)
--- --- -----------
p1 c2 3
p2 c1 6
MySQL MAX() function with GROUP BY retrieves maximum value of an expression which has undergone a grouping operation (usually based upon one column or a list of comma-separated columns).
Can I use MAX(COUNT()) in SQL? I came across an interesting SQL challenge that looked easy first and then proved to be a bit tricker than expected. And the short answer to the above question is, no. You can't.
Assuming a database system (you haven't specified one, but I suspect Oracle?) that supports windowing functions and CTEs, I'd write:
;With Groups as (
select pid,cid,COUNT(*) as cnt from checks group by pid,cid
), Ordered as (
select pid,cid,cnt,
ROW_NUMBER() OVER (PARTITION BY pid ORDER BY cnt desc) as rn,
COUNT(*) OVER (PARTITION BY pid) as multi
from Groups
)
select pid,cid,cnt
from Ordered
where rn = 1 and multi > 1
The first CTE (Groups
) just finds the counts for each unique cid,pid
combination. The second CTE (Ordered
) assigns row numbers to these results based on the count - with the highest count assigned a row number of 1. We also count how many total rows have been produced for each pid
.
Finally, we select those rows which were assigned a row number of 1 (the highest count) and for which we obtained multiple results for the same pid
.
Here's an Oracle fiddle to play with. And here's an SQL Server version (and thanks to Andriy M for producing the Oracle one)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With