【问题标题】:Retrieving the max datetime record in each group with multiple duplicate max datetime - MySQL Ask使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - MySQL 问答
【发布时间】: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?
  • @nick:例如,我正在使用基于表中最早 Id 的 a_column 我正在使用 MySQL 5.7

标签: mysql sql select group-by greatest-n-per-group


【解决方案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) 上建立索引。

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2011-05-10
      • 2017-06-13
      • 2019-04-25
      相关资源
      最近更新 更多