使用 DB2,您如何为一列选择具有 MAX 的行,然后在同一张表的另一列的结果子集中选择具有 MAX 的行?

Posted

技术标签:

【中文标题】使用 DB2,您如何为一列选择具有 MAX 的行,然后在同一张表的另一列的结果子集中选择具有 MAX 的行?【英文标题】:Using DB2, how do you select rows with MAX for one column and then select rows with MAX on the resulting subset for another column on the same table? 【发布时间】:2020-03-11 07:59:44 【问题描述】:

例如这是表 PEOPLE 上的数据集:

Name     Due_Date     Seq_Num
Peter    2020-03-01   001
Peter    2020-03-01   002
Peter    2020-03-02   001
Paul     2020-03-03   001
Paul     2020-03-03   002
Paul     2020-03-04   001
Paul     2020-03-04   002
Mary     2020-03-05   001
Mary     2020-03-05   002

如果我执行 SELECT NAME, MAX(DUE_DATE), MAX(SEQ_NUM) FROM PEOPLE GROUP BY NAME,它将返回 ff:

Name     Due_Date     Seq_Num
Peter    2020-03-02   002
Paul     2020-03-04   002
Mary     2020-03-05   002

但我想要的是:

Name     Due_Date     Seq_Num
Peter    2020-03-02   001
Paul     2020-03-04   002
Mary     2020-03-05   002

因为我想要 MAX() Due_Date 的 MAX() Seq_Num 和 Peter,在他的 MAX() Due_Date 上,没有 Seq_Num 002,所以值输出应该是 001。我如何通过 SQL 选择它( DB2)?

【问题讨论】:

【参考方案1】:

试试这个:

/*
WITH PEOPLE (Name, Due_Date, Seq_Num) AS 
(
VALUES
  ('Peter', '2020-03-01', '001')
, ('Peter', '2020-03-01', '002')
, ('Peter', '2020-03-02', '001')
, ('Paul ', '2020-03-03', '001')
, ('Paul ', '2020-03-03', '002')
, ('Paul ', '2020-03-04', '001')
, ('Paul ', '2020-03-04', '002')
, ('Mary ', '2020-03-05', '001')
, ('Mary ', '2020-03-05', '002')
)
*/
SELECT Name, Due_Date, Seq_Num 
FROM
(
SELECT Name, Due_Date, Seq_Num, RANK() OVER (PARTITION BY NAME ORDER BY Due_Date DESC, Seq_Num DESC) MX_
FROM PEOPLE
)
WHERE MX_ = 1;

【讨论】:

以上是关于使用 DB2,您如何为一列选择具有 MAX 的行,然后在同一张表的另一列的结果子集中选择具有 MAX 的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个 ID 获取具有 max(TIMESTAMP) 的行? [复制]

如何为每个键值选择具有最新时间戳的行?

您如何为代码签名的 Dotnet 程序集添加时间戳?

当您的实例位于 ELB 之后时,您如何为 AWS 建立维护页面?

SqlSever基础 MAX 查看一个表中具有特定内容的行中某一列的最大值

查询以选择具有特定最后一列的所有表 Ibm Db2 z/os