mySQL如何从没有组的重复值中选择MAX(日期)[重复]

Posted

技术标签:

【中文标题】mySQL如何从没有组的重复值中选择MAX(日期)[重复]【英文标题】:mySQL How to SELECT MAX(date) from duplicate values without group [duplicate] 【发布时间】:2021-03-22 19:48:44 【问题描述】:

我有这张桌子:

id   obj_nr   el_nr   location   date
0    1234     1        a3         2020-01-01
1    1234     2        a2         2020-01-02
2    1234     3        a4         2020-01-03
3    1234     1        a9         2020-01-04

不,我想连接 obj_nr 和 element_nr 来查找重复项。 当我找到一个重复时,我不仅要选择日期最近的那个。

结果应该是:

id   obj_nr   el_nr   location   date
1    1234     2        a2         2020-01-02
2    1234     3        a4         2020-01-03
3    1234     1        a9         2020-01-04

我的查询应该是什么样子?

这是我尝试过的:

SELECT MAX(id) id, obj_nr, el_nr, location, max(date_scanned)
FROM  element_location WHERE obj_nr = :obj_nr
GROUP BY obj_nr, el_nr, location

但这不会给我最新的副本。

【问题讨论】:

【参考方案1】:

您可以按如下方式使用NOT EXISTS

select *
from element_location e
where not exists (
    select 1
    from element_location ee
    where ee.obj_nr = e.obj_nr and ee.element_nr = e.element_nr
      and ee.date > e.date
)

【讨论】:

【参考方案2】:

您可以使用子查询进行过滤:

select *
from element_location el
where date = (
    select max(el1.date)
    from element_location el1
    where el1.obj_nr = el.obj_nr and el1.element_nr = el.element_nr
)

这将利用(obj_nr, element_nr, date desc) 上的索引。

或者,在 mysql 8.0 中,您可以使用窗口函数:

select *
from (
    select el.*, 
        rank() over(partition by obj_nr, element_nr order by date desc) rn
    from element_location el
) el
where rn = 1

【讨论】:

完美。它有效:)

以上是关于mySQL如何从没有组的重复值中选择MAX(日期)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从每个值中选择 max()

如何在mysql选择查询中获取两个日期之间的日期列表[重复]

MySQL MIN/MAX 所有行

如何在 CI Active Record 中按 MAX 日期选择

MySQL 从连接表中选择 MAX 日期

获取每个月 SQL 的组的 MAX 值