获取group by最后一条记录

  • 创建测试表
  • 插入数据
  • 查看数据
  • 解决方案

创建测试表

create table login_log (id int primary key auto_increment, uid int, login_at datetime, login_device varchar(16))

插入数据

INSERT INTO `login_log` (`id`, `uid`, `login_at`, `login_device`) VALUES (1, 1, '2022-04-01 14:34:54', 'PC');
INSERT INTO `login_log` (`id`, `uid`, `login_at`, `login_device`) VALUES (2, 2, '2022-03-01 14:35:08', 'MOBILE');
INSERT INTO `login_log` (`id`, `uid`, `login_at`, `login_device`) VALUES (3, 1, '2022-04-14 14:35:27', 'WEB');
INSERT INTO `login_log` (`id`, `uid`, `login_at`, `login_device`) VALUES (4, 2, '2022-04-30 14:35:35', 'WEB');

查看数据

select * from login_log;
id   uid login_at            login_device
1   1   2022-04-01 14:34:54 PC
2   2   2022-03-01 14:35:08 MOBILE
3   1   2022-04-14 14:35:27 WEB
4   2   2022-04-30 14:35:35 WEB

group by后默认是获取第一条记录的,

如果只想获取group by后的某个字段的最大值,比如说要获取用户最后的登录时间,那么我们可以:

select uid, max(login_at) as last_login_at from login_log group by uid
uid  last_login_at
1   2022-04-14 14:35:27
2   2022-04-30 14:35:35

但是,我们可能会有这样的需求:获取用户的最后登录时间以及登录设备

你可能会想到:

select uid, max(login_at) as last_login_at, login_device from login_log group by uid

这样是不行的,上面已经提及到group by后默认是会取第一条数据,所以这样查出来的login_device将会是分组后的第一条数据,即用户第一次登录时所使用的设备,而不是最后登录时间所对应的登录设备。

那么有以下几种

解决方案

  • 子查询的方式(可读性最好):
select * from login_log where id in (select max(id) from login_log group by uid)

or

select * from login_log as log1 join (select max(id) as id from login_log group by uid) as log2 where log1.id = log2.id
  • 连表的方式
select log1.* from login_log as log1
left join login_log as log2 on log1.uid = log2.uid and log1.id < log2.id
where log2.id is null
  • exists的方式
select
*
from login_log as log1
where not exists (select * from login_log as log2where log2.uid = log1.uidand log2.Id > log1.Id
)
  • window function的方式(mysql8)
WITH ranked_log AS (SELECT log.*, ROW_NUMBER() OVER (PARTITION BY uid ORDER BY id DESC) AS rnFROM login_log AS log
)
SELECT * FROM ranked_log WHERE rn = 1;

参考文档:StackOverflow

sql获取group by最后一条记录相关推荐

  1. php 最后一条记录,PHP / MYSQL:在联接表的联接AND行数中获取表的最后一条记录

    好的,我有两个表,一个类别表和一个职位表. 我希望构造一个查询,该查询将返回每个类别,该类别的帖子表中的最后一条记录(category.id = post.category_id)以及所有具有post ...

  2. sql 取表的前10条记录,任意中间几行的记录

    取表的前10条记录 with a as(select *,row_number()over(order by department)rn from _SucceedStaff ) select * f ...

  3. 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)...

    partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...

  4. sql 删除最早的一条记录

    删除最早的一条记录 delete from tablename where id = (select id from tablename where xxx=yyy limit 0,1);" ...

  5. sql重复数据只取一条记录

    1.SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法: SEL ...

  6. mysql 获取group by最新一条数据

    可能会遇到这么一种情况:1.获取各个分组的最新一条数据,2.根据各组最新一条数据关联查出其他数据 查询各组最新一条数据 查询各组最新一条数据,这个比较简单,但也不并不是group by 加order ...

  7. SQL语句一次INSERT多条记录的方法

    1.SQL Server或MySQL中: INSERT INTO `userTable` (`user_id`, `user_name`) VALUES (1, 'dsf'), (2, 'fgy'), ...

  8. Sql语句实现某列每条记录与同列最大值的差值计算

    题目:找出每部电影和单部电影销售冠军之间的销售差,列出电影名,销售额差额 表结构: 结果: SQL语句: select title, ABS(total_sales - (select total_s ...

  9. sql server数据集中取第一条记录及保留几位小数的两种做法及前n行写法

    1.使用top(1) eg: select top(1) num,Name from M_Student where name = 'xy' 前n行可使用top https://blog.csdn.n ...

最新文章

  1. 布兰森:激励是最好的加速器
  2. mysql 网络io_分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识
  3. html5 css3 卡片切换,HTML5之纯CSS3实现的tab标签切换
  4. C# Winform 窗体美化(六、双层窗体)
  5. primitive types
  6. linux安装consul集群
  7. 数据库操作导入导出以及加快查询速度
  8. ai png转矢量图_Boxy SVG for Mac(矢量图编辑器)
  9. mysql备份的 三种方式
  10. 在excel中计算机和函数是,理解Excel函数
  11. 【高等数学笔记】变限积分求导问题
  12. 外贸常用术语_2017常用外贸术语大全
  13. 将一个3x4阶矩阵转置。
  14. 微信授权登录:移动端[unionid](一)
  15. 游戏编程中的人工智能技术
  16. 2022国内IB学校表现如何?
  17. Python将两个列表合并为一个字典
  18. BiomaRt 包进行基因ID转换
  19. Linux下寻求帮助
  20. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(四) 第五章 · 图形渲染与视觉外观 The Visual Appearance

热门文章

  1. 以Python角度学习Javascript(一)
  2. Mac下brew及brew-cask安装使用
  3. python红楼梦人物词频统计_用R进行文本分析初探——以《红楼梦》为例
  4. ipad4使用教程 ipad mini使用技巧
  5. ThinkPad 宝典全集
  6. Python学习(4)——数学类问题解答
  7. Excel中的小技巧amp;大智慧
  8. 阿里云ECS服务器部署
  9. uniapp延迟执行_【 vue / uniapp 】延迟加载数据的特殊处理
  10. c语言中 5.1lf什么意思,期货股指lf_中金所期货指数IF、IH、IC分别是什么英文单词的缩写_期货攻略网...