如何用SQL实现按CardNumber分组取LastEntrance最新行
按CardNumber去重保留最新入场记录的SQL实现
可以通过标准SQL语句实现该需求,假设你的表名为access_record,以下给出两种常用的兼容写法:
- 窗口函数写法(适配MySQL 8.0+、PostgreSQL、SQL Server、Oracle等所有支持窗口函数的现代数据库)
SELECT CardNumber, Name, LastName, LastEntrance FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CardNumber ORDER BY LastEntrance DESC) AS row_rank FROM access_record ) temp_table WHERE row_rank = 1;
逻辑说明:用ROW_NUMBER()窗口函数对每个CardNumber的分组内记录,按LastEntrance倒序排序,排序值为1的就是该分组下最新的记录,外层查询只保留排序值为1的行即可。如果同一个CardNumber存在多条LastEntrance完全相同的最新记录,该写法只会返回其中一条;如果需要返回所有同时间的最新记录,可以把ROW_NUMBER()替换为RANK()。
- 关联子查询写法(兼容MySQL 5.x等所有不支持窗口函数的低版本数据库)
SELECT a.* FROM access_record a INNER JOIN ( SELECT CardNumber, MAX(LastEntrance) AS latest_entrance FROM access_record GROUP BY CardNumber ) b ON a.CardNumber = b.CardNumber AND a.LastEntrance = b.latest_entrance;
逻辑说明:先通过子查询统计出每个CardNumber对应的最新LastEntrance值,再将原表和子查询结果按卡号和最新时间关联,匹配到的就是每个卡号对应的最新完整记录,该写法会返回同一个卡号下所有同时间的最新记录。
内容的提问来源于stack exchange,提问作者serkanz
相关产品推荐
相关产品推荐

