使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - 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
如果我运行按A
和max(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 问答的主要内容,如果未能解决你的问题,请参考以下文章