使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - MySQL 问答

Posted

技术标签:

【中文标题】使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - MySQL 问答【英文标题】:Retrieving the max datetime record in each group with multiple duplicate max datetime - MySQL Ask 【发布时间】:2020-10-03 16:52:57 【问题描述】:

有一个名为'**work**'的表包含如下所示的数据:

Id  Name  a_Column  work_datetime
-----------------------------------------
1   A      A_1      1592110166
2   A      A_2      1592110166
3   A      A_3      1592110164
4   B      B_1      1582111665
5   B      B_2      1592110166
6   C      C_1      1592110166

如果我运行按Amax(work_datetime) 分组的查询,那么Name='A' 的组可能有2 个选择,但我只需要其中一个带有a_Column='A_1',这样最终所需的输出如下:-

Id   Name   a_Column   work_datetime
-----------------------------------------
1    A       A_1       1592110166
5    B       B_2       1592110166
6    C       C_1       1592110166

在 group by 处理重复记录是 mysql 似乎不支持的东西!

有什么方法可以达到要求的结果?

【问题讨论】:

如何决定要显示a_column 的哪个值? 你用的是什么版本的 MySQL? 见meta.***.com/questions/333952/… @nick:例如,我正在使用基于表中最早 Id 的 a_column 我正在使用 MySQL 5.7 【参考方案1】:

从版本 8 开始,您可以使用 row_number() 为每一行分配一个编号,该编号按照每个名称重复的时间的降序排列该行的位置。在派生表中执行此操作,然后从中选择此编号为 1 的行。

SELECT x.id,
       x.name,
       x.a_column,
       x.work_datetime
       FROM (SELECT w.id,
                    w.name,
                    w.a_column,
                    w.work_datetime,
                    row_number() OVER (PARTITION BY w.name
                                       ORDER BY w.work_datetime) rn
                    FROM work w) x
       WHERE x.rn = 1;

row_number() 没有重复项。如果有两行具有相同的名称和时间,则随机选择其中之一。如果要保留重复项,可以将 row_number() 替换为 rank()

【讨论】:

【参考方案2】:

一个适用于所有 MySQL 版本的简单选项是使用子查询进行过滤:

select w.*
from work w
where w.id = (
    select id 
    from work w1 
    where w1.name = w.name 
    order by work_datetime desc, a_column
    limit 1
)

对于每个name,这将带来最新work_datetime 的行;通过选择具有最小 a_column 的行来打破平局(这就是我理解您的要求的方式)。

为了提高性能,您需要在(work_datetime, a_column, id) 上建立索引。

【讨论】:

以上是关于使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - MySQL 问答的主要内容,如果未能解决你的问题,请参考以下文章

检索表中不同 ID 的最大日期 [重复]

Excel—分组然后取每组中对应时间列值最大的或者最小的

具有共同 id 的组中具有最大天数的两个日期之间的差异

SQL为每个部门选择最大销售额的日期[重复]

从Oracle SQL中的每个组中选择具有最大值的行[重复]

查找每个 ID 的特定日期之前的最大日期和特定日期之后的最小日期 [关闭]