对于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的新手,请帮助。
答案 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