MySQL-分组并根据最近的分组返回每行的一行

问题描述 投票:0回答:3

所以我所期望的问题很简单,但我一生无法解决!

我有一张这样的桌子:

ID名称状态日期1鲍勃好01/01/20202约翰·古德01/01/20203 bob bad 02/01/20204约翰·古德02/01/20205本本古德02/01/2020

我想检索每个名称的最新记录。

我尝试了以下操作:

Select name, status, MAX(date) from table
group by name
order by MAX(date)

我以为这行得通,但是它返回的是bob,john和ben的记录,但是显示bob的日期为02/01/2020,但他的状态为其他记录中的“好”!

不知道如何以最简单的方式执行此操作,非常感谢所有帮助!

mysql sql
3个回答
2
投票

不要认为这是聚合。认为这是过滤!

Select t.name, t.status, t.date
from table t
where t.date = (select max(t2.date)
                from table t2
                where t2.name = t.name
               );

您不是聚集任何东西。您的结果集只需要一行中的列,该行具有每个名称的最大日期。这更像是过滤而不是分组。


0
投票

使用not exists

select t.* from tablename t
where not exists (
  select 1 from tablename
  where name = t.name and date > t.date
)

结果是:该表的每一行都没有另一行具有相同的name和更高的date。对于MySql 8.0+,您可以使用ROW_NUMBER()窗口函数:

select t.id, t.name, t.status, t.date
from (
  select *, row_number() over (partition by name order by date desc) rn
  from tablename
) t
where t.rn = 1

0
投票

Maria DB 10.2显然是。 – Ed Jones

SELECT DISTINCT name, 
                FIRST_VALUE(status) OVER (PARTITION BY name 
                                          ORDER BY date DESC) status,
                MAX(date) OVER (PARTITION BY name) date
FROM table;
© www.soinside.com 2019 - 2024. All rights reserved.