DB2中如何获取每个分组的最后一条记录?求技术解决方案
获取DB2中每个分组的最后一条记录
刚接触DB2的时候,确实会因为它严格遵循SQL标准的GROUP BY规则有点头疼——毕竟MySQL里那种先排序再分组取第一条的“投机取巧”写法在这儿完全行不通。不过别担心,咱们有几种靠谱的方法来实现你要的「获取每个分组最后一条记录」的需求,下面给你详细讲讲:
方法一:使用ROW_NUMBER()窗口函数(推荐,适合DB2 9.7及以上版本)
这是最现代也最灵活的写法,利用DB2的窗口函数功能,直接给每个分组内的记录按时间排序并编号,然后取编号为1的那条(也就是最新的记录):
WITH ranked_records AS ( SELECT *, -- 按submitter分组,组内按created_at降序排序,给每条记录编序号 ROW_NUMBER() OVER (PARTITION BY submitter ORDER BY created_at DESC) AS rn FROM devops.clearquest_clearquest ) -- 取每个分组里序号为1的记录(即最新的那条) SELECT * FROM ranked_records WHERE rn = 1;
小补充:处理同时间的多条记录
如果同一个submitter下有多个记录的created_at完全相同,且你想把这些同时间的记录都保留下来,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK():
WITH ranked_records AS ( SELECT *, RANK() OVER (PARTITION BY submitter ORDER BY created_at DESC) AS rn FROM devops.clearquest_clearquest ) SELECT * FROM ranked_records WHERE rn = 1;
这样所有和最新时间相同的记录都会被筛选出来,而不是只保留一条。
方法二:关联子查询(适合旧版本DB2)
如果你的DB2版本比较老,不支持窗口函数,可以用关联子查询的方式,先找到每个分组的最大created_at,再匹配原表的对应记录:
SELECT cq.* FROM devops.clearquest_clearquest cq WHERE cq.created_at = ( -- 找到当前submitter对应的最大created_at SELECT MAX(created_at) FROM devops.clearquest_clearquest WHERE submitter = cq.submitter );
这个写法逻辑简单易懂,但在数据量较大的情况下,性能可能不如窗口函数(如果没有合适的索引的话)。
注意点:别踩列名的引号坑
你原来的SQL里写了ORDER BY 'created_at' DESC,这里要注意:单引号包裹的是字符串常量,不是列名!DB2会把它当成一个固定字符串来排序,而不是按created_at列的值排序。正确的写法应该是直接写列名,或者用双引号(如果列名有特殊字符):
-- 正确写法 ORDER BY created_at DESC
内容的提问来源于stack exchange,提问作者Crypto营长
相关产品推荐
相关产品推荐

