【问题标题】:Find top 3 with ties in SQL for each day查找每天在 SQL 中排名前 3 位的
【发布时间】:2021-11-08 09:57:07
【问题描述】:

如果我有下表,

Day Name Amount
Monday John 100
Monday Liam 120
Monday Rico 125
Monday Erin 110
Tuesday Maya 150
Tuesday John 150
Tuesday Liam 100
Tuesday Sern 120
Tuesday Rico 110
Wednesday Maya 500

对于每一天,我想知道谁拥有最高的 3 个金额以及这些金额是多少。但如果有超过 3 人的最高 3 金额,那么当天可能有超过 3 人。如果一天少于 3 三个人,那么只需报告这些人。 所以输出应该是,

Day Name Amount
Monday Rico 125
Monday Liam 120
Monday Erin 110
Tuesday Maya 150
Tuesday John 150
Tuesday Sern 120
Tuesday Rico 110
Wednesday Maya 500

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果你使用的是支持窗口函数的 MySQL,你可以使用DENSE_RANK():

    SELECT dayname, names, amount
    FROM
    (SELECT *, 
           DENSE_RANK() OVER(PARTITION BY dayname ORDER BY amount DESC) AS rnk
    FROM mytable) v
    WHERE rnk <= 3
    ORDER BY dayname, amount DESC;
    

    如果您使用的是旧版本的 MySQL,那么您可以试试这个:

    SELECT mytable.*
     FROM mytable
    JOIN
     (SELECT *,
           CASE WHEN @d = dayname THEN @rn := @rn+1 
                ELSE @rn := 1 END AS rnk,
           @d := dayname
      FROM
       (SELECT dayname, amount
         FROM mytable
         GROUP BY dayname, amount) t1
       CROSS JOIN (SELECT @d := NULL, @rn := 0) rnm
      ORDER BY dayname, amount DESC) v
    ON mytable.dayname=v.dayname AND mytable.amount=v.amount
    WHERE rnk <= 3;
    

    Demo fiddle

    【讨论】:

      【解决方案2】:

      在 MySQL 窗口函数中使用rank()

      select * 
      from (
        select *, rank() over(partition by day order by amount desc) rk
        from table1
      ) r
      where r.rk in (1,2,3)
      

      有表格数据

      create table table1 (
       day varchar(10),
       name varchar(100),
       amount decimal(10,2)
      ) ;
      insert into table1 values 
      ('Monday','Rico',125),
      ('Monday','Liam',120),
      ('Monday','Erin',110),
      ('Tuesday','Maya',150),
      ('Tuesday','John',150),
      ('Tuesday','Sern',120),
      ('Tuesday','Rico',110),
      ('Wednesday','Maya',500);
      

      【讨论】:

        猜你喜欢
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-07
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2016-03-03
        相关资源
        最近更新 更多