首页 > 解决方案 > 如何使用 DB2 检索每个组中的最后一条记录?

问题描述

至于 MySQL,我知道如何检索每个组中的最后一条记录,例如:

SELECT A.* 
FROM (
  SELECT * 
  FROM devops.clearquest_clearquest 
  ORDER BY 'created_at' DESC
) AS A 
GROUP BY A.submitter;

但是 DB2 有点不同,您只能选择GROUP BY之后使用的列,如下所示:

SELECT A.submitter 
FROM (
  SELECT * 
  FROM devops.clearquest_clearquest 
  ORDER BY 'created_at' DESC
) AS A 
GROUP BY A.submitter;

所以,如果我想获取两列,我需要像这样对它们进行 GROUP BY:

SELECT A.column01, A.column02 
FROM (
  SELECT * 
  FROM devops.clearquest_clearquest 
  ORDER BY 'created_at' DESC
) AS A 
GROUP BY A.column01, A.column02;

问题来了,如果我 GROUP BY 两列,我无法检索每个组中的最后一条记录。我是 DB2 新手,请帮忙。

标签: sqldb2

解决方案


这是每组任务中最经典的一项,我会使用一些标准解决方案,例如

SELECT cc.*
FROM devops.clearquest_clearquest cc 
JOIN (
    SELECT A.submitter, max('created_at') max_created_at
    FROM devops.clearquest_clearquest A
    GROUP BY A.submitter
) t ON cc.submitter = t.submitter 
   and cc.'created_at' = t.max_created_at

或窗口函数

SELECT * 
FROM (
    SELECT *,
      row_number() over (partition by submitter order by 'created_at' desc) rn
    FROM devops.clearquest_clearquest 
) t
WHERE t.rn = 1

请注意 MySQL 的行为不是“标准的”。SELECT如果它们不是GROUP BY或聚合函数的一部分,大多数数据库系统都不允许在后面包含列。如果您将sql_modeMySQL 设置为ANSI ,那么您的查询将不会通过。


推荐阅读