所以我所期望的问题很简单,但我一生无法解决!
我有一张这样的桌子:
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,但他的状态为其他记录中的“好”!
不知道如何以最简单的方式执行此操作,非常感谢所有帮助!
不要认为这是聚合。认为这是过滤!
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
);
您不是聚集任何东西。您的结果集只需要一行中的列,该行具有每个名称的最大日期。这更像是过滤而不是分组。
使用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
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;