有如下的一个表
months contact COUNT 202007 asdas 45 202007 maouse 1 202007 RORC YANG 1 202007 RORG 2 202007 ROR 5 202008 SARINA 6 202008 MBL 2 202008 MLT 2 ...
我如何能获取到每个月的top2
?
希望得到的结果:
months contact COUNT 202007 asdas 45 202007 ROR 5 202008 SARINA 6 202008 MBL 2 ...
当前 mysql 版本 5.6
请各位大佬帮忙看一下, 感谢!
1 zm8m93Q1e5otOC69 2021-03-29 14:25:46 +08:00 select * from a A where (select cout(*) from a B where A.mOnths= B.months and A.count >= B.count) <= 2 |
2 zm8m93Q1e5otOC69 2021-03-29 14:26:26 +08:00 count(*) 拼错了,还有你发错分区了吧。。 |
![]() | 3 Nostalgiaaaa 2021-03-29 14:29:32 +08:00 SELECT * FROM (SELECT *, ROW_NUMBER() over(partition by months ORDER BY COUNT desc) ranks FROM table ) a WHERE a.ranks IN (1, 2) |
![]() | 4 ahmcsxcc 2021-03-29 14:31:25 +08:00 @Nostalgiaaaa #3 mysql 5.6 不支持这个语法 |
5 zm8m93Q1e5otOC69 2021-03-29 15:32:25 +08:00 @ahmcsxcc 是的,mysql 这个需求比较难弄啊,感觉要写存储过程。。不然就要在代码里写了。。还是 PgSql 函数多 |
![]() | 6 vegetableChick OP @beichenhpy 感谢回复, 但是好像是空结果 |
![]() | 7 vegetableChick OP @Nostalgiaaaa 谢谢回复, 我的 mysql 版本比较旧了 还是 5.6 |
8 zm8m93Q1e5otOC69 2021-03-29 16:03:17 +08:00 @vegetableChick -- part 为 month 对应用谁分组 select z.month,z.count,z.rank from (select x.*, @rownum := @rownum + 1, if(@part = x.month, @r := @r + 1, @r := 1) as rank, @part := x.month from ( select * from test e order by e.count,e.`month` desc) x, ( select @rownum := 0, @part := null, @r := 0) rt)z where z.rank in (1,2) |
9 zm8m93Q1e5otOC69 2021-03-29 16:15:21 +08:00 @vegetableChick ``` -- part 为 month 对应用谁分组 -- 注意 order by 的顺序 select z.month,z.count,z.rank from (select x.*, @rownum := @rownum + 1, if(@part = x.month,@r := @r + 1,@r := 1) as rank, @part := x.month from ( select * from test e order by e.month asc,e.count desc) x, ( select @rownum := 0, @part := null, @r := 0) rt)z where z.rank in (1,2) ``` |
![]() | 10 vegetableChick OP @beichenhpy nb !但是没太看懂, 求大佬讲一下思路 |
![]() | 11 vegetableChick OP @beichenhpy 结果出来了, 但是没懂原理 |
12 zm8m93Q1e5otOC69 2021-03-29 16:41:35 +08:00 @vegetableChick 就是实现了一遍 over(partition by month) |
![]() | 13 vegetableChick OP @beichenhpy 我怎么老觉得不需要 下面的这个`select`, 看上去上面把这些变量又初始化了。 但是去掉就错了 ``` select @rownum := 0, @part := null, @r := 0) rt)z ``` |
14 zm8m93Q1e5otOC69 2021-03-29 16:49:04 +08:00 @vegetableChick 下面是初始化的。。不要去掉 |
15 zm8m93Q1e5otOC69 2021-03-29 16:49:58 +08:00 @vegetableChick 看一下 mysql 执行顺序。。from 是先执行的 |
![]() | 16 vegetableChick OP @beichenhpy 嗯 感谢,学习一下 |
![]() | 17 more1sec 2021-03-29 17:43:47 +08:00 程序代码处理吧。。。别用子查询 |
18 zzz686970 2021-03-31 12:59:16 +08:00 @beichenhpy 我测试了一下,子查询里面应该是小于?而且如果 count 有重复的数字,应该换成< ``` select * from t A where (select count(*) from t B where A.mOnth= B.month and A.cnt < B.cnt) < 2 ``` |