mysql 获取排序后分组获取第一条数据(分组获取某个值最大的记录)

方式0(mysql8支持,利用窗口函数,优先推荐)

SELECT * FROM (
    SELECT
        id,
        student_id,
        score,
        clazz_id,
        ROW_NUMBER() OVER( PARTITION BY clazz_id  ORDER BY clazz_id ASC,score DESC) as row_num
    FROM
        student_score
    ORDER BY
        clazz_id,row_num
) temp where row_num <= 3

 clazz_id 可以替换为多个字段,根据什么分组就替换为什么字段,然后根据order by生成行号

 

 

方式1,时间最大,sql简单

SELECT
    *
FROM
    (
        SELECT
            *
        FROM
            TABLE t
        WHERE
            1
        HAVING
            1
        ORDER BY
            t.create_time DESC
    ) a
GROUP BY
    user_id 
ORDER BY
    create_time DESC;

 

方式2(推荐),分数最高,同样的下方的也支持按照某一个条件分组取每个组前N条,把count <= 1 改成对应的条数就行了

SELECT
               *
            FROM
                (
                    SELECT
                        id,
               student_id,
               score,
                        clazz_id ,
                        @rownum:=IF(@clazz_id=clazz_id,@rownum+1,1) count,
                        @clazz_id := clazz_id
                    FROM
                        student_score,
              (select @rownum := 0,@clazz_id:=0) r
                    ORDER BY
                        clazz_id,score DESC   -- 此处把相同班级的拍在一起用于计算行编号,再把分数降序排序
                ) temp
            WHERE count <= 1   -- 分数降序的,直接取出最前1条

 

 

分享一个淘宝、京东、拼多多、饿了么、美团、抖音等等买东西后真实返钱小技巧,

打车、外卖领券,充值话费95折好像也可以

使用教程用微信扫下方二维码查看详细说明

 

posted @ 2021-02-03 11:02  Binz  阅读(4060)  评论(0编辑  收藏  举报