sql获取group by最后一条记录
获取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最后一条记录相关推荐
- php 最后一条记录,PHP / MYSQL:在联接表的联接AND行数中获取表的最后一条记录
好的,我有两个表,一个类别表和一个职位表. 我希望构造一个查询,该查询将返回每个类别,该类别的帖子表中的最后一条记录(category.id = post.category_id)以及所有具有post ...
- sql 取表的前10条记录,任意中间几行的记录
取表的前10条记录 with a as(select *,row_number()over(order by department)rn from _SucceedStaff ) select * f ...
- 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)...
partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...
- sql 删除最早的一条记录
删除最早的一条记录 delete from tablename where id = (select id from tablename where xxx=yyy limit 0,1);" ...
- sql重复数据只取一条记录
1.SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法: SEL ...
- mysql 获取group by最新一条数据
可能会遇到这么一种情况:1.获取各个分组的最新一条数据,2.根据各组最新一条数据关联查出其他数据 查询各组最新一条数据 查询各组最新一条数据,这个比较简单,但也不并不是group by 加order ...
- SQL语句一次INSERT多条记录的方法
1.SQL Server或MySQL中: INSERT INTO `userTable` (`user_id`, `user_name`) VALUES (1, 'dsf'), (2, 'fgy'), ...
- Sql语句实现某列每条记录与同列最大值的差值计算
题目:找出每部电影和单部电影销售冠军之间的销售差,列出电影名,销售额差额 表结构: 结果: SQL语句: select title, ABS(total_sales - (select total_s ...
- sql server数据集中取第一条记录及保留几位小数的两种做法及前n行写法
1.使用top(1) eg: select top(1) num,Name from M_Student where name = 'xy' 前n行可使用top https://blog.csdn.n ...
最新文章
- 布兰森:激励是最好的加速器
- mysql 网络io_分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识
- html5 css3 卡片切换,HTML5之纯CSS3实现的tab标签切换
- C# Winform 窗体美化(六、双层窗体)
- primitive types
- linux安装consul集群
- 数据库操作导入导出以及加快查询速度
- ai png转矢量图_Boxy SVG for Mac(矢量图编辑器)
- mysql备份的 三种方式
- 在excel中计算机和函数是,理解Excel函数
- 【高等数学笔记】变限积分求导问题
- 外贸常用术语_2017常用外贸术语大全
- 将一个3x4阶矩阵转置。
- 微信授权登录:移动端[unionid](一)
- 游戏编程中的人工智能技术
- 2022国内IB学校表现如何?
- Python将两个列表合并为一个字典
- BiomaRt 包进行基因ID转换
- Linux下寻求帮助
- 【转载】【《Real-Time Rendering 3rd》 提炼总结】(四) 第五章 · 图形渲染与视觉外观 The Visual Appearance
热门文章
- 以Python角度学习Javascript(一)
- Mac下brew及brew-cask安装使用
- python红楼梦人物词频统计_用R进行文本分析初探——以《红楼梦》为例
- ipad4使用教程 ipad mini使用技巧
- ThinkPad 宝典全集
- Python学习(4)——数学类问题解答
- Excel中的小技巧amp;大智慧
- 阿里云ECS服务器部署
- uniapp延迟执行_【 vue / uniapp 】延迟加载数据的特殊处理
- c语言中 5.1lf什么意思,期货股指lf_中金所期货指数IF、IH、IC分别是什么英文单词的缩写_期货攻略网...