有一个数据表为targt,数据如下所示:

Id   Name   Other_Columns
-------------------------
1    A       1
2    A       2
3    A       3
4    B       4
5    B       5
6    C       6

我现在想要提取name为A,B,C这三个分组最后一条数据。使用group by语句:select * from target group by name 得到以下结果

Id   Name   Other_Columns
-------------------------
1    A       1
4    B       4
6    C       6

如何高效的获取到以下结果?

Id   Name   Other_Columns
-------------------------
3    A       3
5    B       5
6    C       6

第一种方法:mysql8.0支持窗口功能

WITH ranked_target AS (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
  FROM target AS m
)
SELECT * FROM ranked_target WHERE rn = 1;

第二种方法 多层嵌套查询:

select * from `target` 
where `id` in 
(select max(`id`) from `target` group by `name`)

更优化

select b.* from
(select max(`id`) as id from `target` group by `name`) as a
join `target`as b on
a.id=b.id

第三种方法 最优方法:

SELECT * FROM `target ` GROUP BY name DESC


本文地址: http://chenxm.cc/article/1212.html
版权声明: 本文为原创文章,版权归  陈新明  所有,欢迎分享本文,转载请保留出处!
上一篇: python 获取当前操作系统类型
下一篇: python pymysql利用date_format提取日期时间字段自动输出为字符串而不是datetime
发表评论

还没有留言,还不快点抢沙发?