有如下的一个表
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
uselessVisitor 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
uselessVisitor 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
uselessVisitor 2021-03-29 15:32:25 +08:00
@ahmcsxcc 是的,mysql 这个需求比较难弄啊,感觉要写存储过程。。不然就要在代码里写了。。还是 PgSql 函数多
|
6
vegetableChick OP @beichenhpy 感谢回复, 但是好像是空结果
|
7
vegetableChick OP @Nostalgiaaaa 谢谢回复, 我的 mysql 版本比较旧了 还是 5.6
|
8
uselessVisitor 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
uselessVisitor 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
uselessVisitor 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
uselessVisitor 2021-03-29 16:49:04 +08:00
@vegetableChick 下面是初始化的。。不要去掉
|
15
uselessVisitor 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 ``` |