如何使用DB2检索每个组中的最后一条记录?

时间:2019-11-19 09:38:24

标签: sql db2

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

io.github.bonigarcia.wdm.WebDriverManagerException: A response error is detected: HTTP/1.1 403 Forbidden

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

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

因此,如果我想获取两列,则需要像这样对它们进行分组:

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

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

4 个答案:

答案 0 :(得分:1)

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

SELECT cc.*
FROM devops.clearquest_clearquest cc 
(
    SELECT A.submitter, max('created_at') max_created_at
    FROM devops.clearquest_clearquest
    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之后包括列。如果将MySQL的sql_mode设置为ANSI,则查询将不会通过。

答案 1 :(得分:1)

在Db2中,您可以执行此操作以获取每个组created_at中具有最高column01, column02日期的行。

嗯,严格来讲,这是每个组中created_at最高的行之一。如果ROW_NUMBER()不是唯一的,则created_at, column01, column02是不确定的

SELECT * 
FROM (
    SELECT *
    ,    row_number() over (
                  partition by A.column01, A.column02
                  order by "created_at" desc) rn
    FROM devops.clearquest_clearquest A
) t
WHERE t.rn = 1

请注意,如果列名在表定义中不是大写字母,则必须用双引号(而不是单引号)包围

答案 2 :(得分:1)

这是不正确的SQL:

SELECT cc.* 
FROM (SELECT * 
      FROM devops.clearquest_clearquest 
      ORDER BY created_at DESC
     ) cc
GROUP BY cc.submitter;

注意:created_at周围加上引号。

因为在SELECT中有不是GROUP BY键的列,而不是聚合函数的参数。这将在几乎所有数据库中返回语法错误。幸运的是,它将在最新版本的MySQL(具有默认选项)中也被破坏。

最有效的等效方法通常是:

select cc.*
from devops.clearquest_clearquest cc
where cc.created_at = (select max(cc2.created_at)
                       from devops.clearquest_clearquest cc2
                       where cc2.submitter = cc.submitter
                      );

使用devops.clearquest_clearquest(submitter, created_at)上的索引,这通常是所有数据库中最快的方法。

其他答案使用row_number()提供了答案。这也是一个很好的解决方案,但通常会慢一点,因为在大多数过滤掉之前,行号已分配给所有行。

答案 3 :(得分:1)

您可以查询表并将其联接到表中以获取最大日期(或要根据/查找分组的任何内容

例如

select t1.submitter, XXGroup2, t2.maxdate from
    (select * FROM devops.clearquest_clearquest) t1
        inner join
    (SELECT submitter, XXGroup2, max(created_at) as maxdate 
     FROM devops.clearquest_clearquest 
     GROUP BY XXGroup1, XXGroup2) t2                                                    
        on t1.submitter = t2.submitter AND t1.XXGROUP2 = t2.XXGROUP2
)                                                                       
order by t1.submitter, t1.XXGROUP2