检索每个组中具有多个重复max datetime的max datetime记录-mysql ask

b1payxdu  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(359)

有一个名为 '**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

如果我运行查询 A 以及 max(work_datetime) ,则可以有2个选择用于 Name='A' 但我只需要一个 a_Column='A_1' 最终期望输出如下follows:-

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

mysql似乎不支持在groupby中处理重复记录!
有什么办法能达到要求的结果吗?

dwbf0jvd

dwbf0jvd1#

一个适用于所有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) .

b09cbbtk

b09cbbtk2#

因为版本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() .

相关问题