0.3、sql 获取表中每一个分组中的第一条数据

问题描述

对于 SQL 搜索有一种场景尽管很少遇到,但是不可避免,就是对于数据进行分组,并且获取每一个分组中第一条数据。
本文给出可行的解决方案。

测试表结构

表字段主要是 id、name、type、date

create table test
(
    id   bigint auto_increment
        primary key,
    name varchar(20) not null,
    type int         not null,
    date datetime    null
);
插入一下数据

在这里插入图片描述

提出需求

获取 type=1,获取 name 和其对应的最早的 date值

问题解决

group by 之后无法获得差异化数据,所以可以先获取唯一id,然后通过多次套用的方式来解决。
即,根据 name 和 date 做第一次分类,组成临时表。
然后对这个临时表做第二次分类,获取每一类的的第一条数据

select name,min(date) from (
                  select name, date
                  from test
                  where type = 1
                  group by name, date
              )tem
group by name

拓展-根据id最简单

如果我们需要获取整条数据,则可以使用 分组+id

select * from test where id in (
    select min(id)
                  from test
                  where type = 1
                  group by name
    )

总结

group by 支持 对一个字段做分类,然后最另一个字段做条件处理。
只要确保每次处理分类字段+该分类下唯一区分条件字段 即可不断缩小数据范围。如果最后得出的数据是主键值,则可以返回来获取完整数据行的值。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值