You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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营长

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:41:49