sql - 如何使用 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 新手,请帮忙。
解决方案
这是每组任务中最经典的一项,我会使用一些标准解决方案,例如
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_mode
MySQL 设置为ANSI ,那么您的查询将不会通过。
推荐阅读
- c++ - 是什么导致存储的 std::list::iterator 变得无效?
- javascript - 如何使用 JavaScript 将文本字符串截断为以省略号结尾的多个字符以用于段落标签数组
- java - 如何对两个数组进行排序,其中一个数组根据另一个数组的排序进行排序?
- sql - 如何在不修改数据库的情况下在多个数据库中的同一个表上触发?
- vba - PowerPoint VBA 是否可以发送 POST 请求?
- python - pyspark pandas udf RuntimeError:返回的列数与指定的模式不匹配
- authentication - 登录并设置 cookie 后 User.Identity.IsAuthenticated 为 false
- rest - 如何使用 Rest API 调用更新 TM1 Cube 数据
- r - 数列因子的计数因子实例
- javascript - 在 Vue 中动态添加带有事件的不同组件