简体   繁体   中英

How to get TopN query group by month MYSQL

There's a table like:

months  contact   COUNT
202007  asdas      45
202007  madhouse    1
202007  RORC YANG   1
202007  RORG        2
202007  ROR         5
202008  SARINA      1
202008  SMB         1

How can I get top 4 query result each month?

Expected result:

months  contact   COUNT
202007  asdas      45
202007  ROR         5
202007  RORG        2
202008  SARINA      1
202008  SMB         1

I'm working with mysql5.6

Here are 2 choices. The first uses rank() over() which does not guarantee only 4 rows per month (there could be more) and the second uses row_number() over() which will limit number of rows to a max of 4 per month

select
    *
from (
      select
          * , rank() over(partition by months order by c desc) as cr
      from (
        select  months, contact, count(*) as c
        from mytable
        group by months, contact
        ) as g
    ) as d
where cr <= 4
;

select
    *
from (
      select
          * , row_number() over(partition by months order by c desc) as rn
      from (
        select  months, contact, count(*) as c
        from mytable
        group by months, contact
        ) as g
    ) as d
where rn <= 4
;

see demo

for older MySQL try a row number hack:

select
    *
from (
      select
            @row_num :=IF(@prev_value=g.months,@row_num+1,1)AS RowNumber
          , g.months
          , g.contact
          , g.c
          , @prev_value := g.months
      from (
        select  months, contact, count(*) as c
        from mytable
        group by months, contact
        ) as g
      CROSS JOIN (SELECT @row_num :=1,  @prev_value :='') vars
      ORDER BY g.months, g.contact
    ) as d
where RowNumber <= 4

see that in demo

TOP5

SELECT z.months, z.contact, z.count
FROM
(SELECT
x.*,
@rownum := @rownum + 1,
IF(@part = x.months,@r := @r + 1,@r := 1) AS rank,
@part := x.months
FROM
(
SELECT
*
FROM
my_table e
ORDER BY
e.months ASC,e.count DESC) X,
(
SELECT
@rownum := 0,
@part := NULL,
@r := 0) rt)z
WHERE z.rank <=5






The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM