跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • MYSQL 求每个月的 topN 问题
未分類
26 3 月 2021

MYSQL 求每个月的 topN 问题

MYSQL 求每个月的 topN 问题

資深大佬 : vegetableChick 4

有如下的一个表

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

请各位大佬帮忙看一下, 感谢!

大佬有話說 (18)

  • 資深大佬 : beichenhpy

    select * from a A where (select cout(*) from a B where A.months = B.months and A.count >= B.count) <= 2

  • 資深大佬 : beichenhpy

    count(*) 拼错了,还有你发错分区了吧。。

  • 資深大佬 : Nostalgiaaaa

    SELECT *
    FROM
    (SELECT *,
    ROW_NUMBER() over(partition by months
    ORDER BY COUNT desc) ranks
    FROM table ) a
    WHERE a.ranks IN (1, 2)

  • 資深大佬 : ahmcsxcc

    @Nostalgiaaaa #3 mysql 5.6 不支持这个语法

  • 資深大佬 : beichenhpy

    @ahmcsxcc 是的,mysql 这个需求比较难弄啊,感觉要写存储过程。。不然就要在代码里写了。。还是 PgSql 函数多

  • 主 資深大佬 : vegetableChick

    @beichenhpy 感谢回复, 但是好像是空结果

  • 主 資深大佬 : vegetableChick

    @Nostalgiaaaa 谢谢回复, 我的 mysql 版本比较旧了 还是 5.6

  • 資深大佬 : beichenhpy

    @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)

  • 資深大佬 : beichenhpy

    @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)
    “`

  • 主 資深大佬 : vegetableChick

    @beichenhpy nb !但是没太看懂, 求大佬讲一下思路

  • 主 資深大佬 : vegetableChick

    @beichenhpy 结果出来了, 但是没懂原理

  • 資深大佬 : beichenhpy

    @vegetableChick 就是实现了一遍 over(partition by month)

  • 主 資深大佬 : vegetableChick

    @beichenhpy 我怎么老觉得不需要 下面的这个`select`, 看上去上面把这些变量又初始化了。 但是去掉就错了
    “`
    select
    @rownum := 0,
    @part := null,
    @r := 0) rt)z
    “`

  • 資深大佬 : beichenhpy

    @vegetableChick 下面是初始化的。。不要去掉

  • 資深大佬 : beichenhpy

    @vegetableChick 看一下 mysql 执行顺序。。from 是先执行的

  • 主 資深大佬 : vegetableChick

    @beichenhpy 嗯 感谢,学习一下

  • 資深大佬 : more1sec

    程序代码处理吧。。。别用子查询

  • 資深大佬 : zzz686970

    @beichenhpy
    我测试了一下,子查询里面应该是小于?而且如果 count 有重复的数字,应该换成<

    “`
    select * from t A where (select count(*) from t B where A.month = B.month and A.cnt < B.cnt) < 2

    “`

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具