Groupwise max mysql查询忽略空列

Groupwise max mysql查询忽略空列,mysql,mariadb,Mysql,Mariadb,我有一张有汽车的桌子。每辆车都有一个唯一的id和其他与汽车统计相关的列。我想展示十大最快的汽车。如果一辆车有相同的内饰+ModelID+MakeID,我只想显示最新的车 例如: Year Make Model Trim Time060 -------------------------------- 2017 Bugatti Chiron null 2.3 2018 Bugatti Chiron null 2.3 我的问题是,如果Trim为空,2017年和2018年都不会出现。如

我有一张有汽车的桌子。每辆车都有一个唯一的id和其他与汽车统计相关的列。我想展示十大最快的汽车。如果一辆车有相同的内饰+ModelID+MakeID,我只想显示最新的车

例如:

Year Make    Model  Trim  Time060
--------------------------------
2017 Bugatti Chiron null  2.3
2018 Bugatti Chiron null  2.3
我的问题是,如果Trim为空,2017年和2018年都不会出现。如果饰件不为空且相同,则我正确获得2018车型

以下是我的疑问:

 SELECT stats.* 
   FROM stats 
NATURAL 
   JOIN
      ( SELECT MakeID
             , ModelID
             , Trim
             , MAX(Year) AS Year 
          FROM stats 
         GROUP 
            BY Trim
             , ModelID
             , MakeID
      ) t
  ORDER 
     BY Time060 
  LIMIT 10
我试过使用…选择MakeID,ModelID,IFNULLTrim,'temp_trim'作为trim,MAXYear作为Year,从统计组中逐个trim,ModelID,MakeID…,但这不起作用

使用notexists和null safe equal to运算符检查null的相等性:


请参阅。

您是否尝试按IFNULLTrim、temp\u trim、ModelID、MakeID分组?只是尝试了,没有成功只是尝试了第一个,成功了!谢谢。您知道您提供的选项中哪一个性能更好吗?这取决于您拥有的数据。我相信对于一个大表,在makeid、modelid、trim上使用复合索引的3d查询会更好。但我个人的偏好是存在和不存在,这一直是我尝试的第一种方式。存在的case执行得更好,因为它会在找到或不找到条件时立即返回。请使用窗口函数ROW_NUMBER选中另一个选项。
select s.* from stats s
where not exists (
  select 1 from stats
  where makeid = s.makeid and modelid = s.modelid and trim <=> s.trim and year > s.year
)
select s.* from stats s
where s.year = (
  select max(year) 
  from stats
  where makeid = s.makeid and modelid = s.modelid and trim <=> s.trim
)
select s.* 
from stats s inner join (
  select makeid, modelid, trim, max(year) year
  from stats
  group by makeid, modelid, trim
) t on t.makeid = s.makeid and t.modelid = s.modelid and t.trim <=> s.trim and t.year = s.year
select t.year, t.makeid, t.modelid, t.trim, t.time060
from (
  select s.*,
    row_number() over (partition by makeid, modelid, trim order by year) rn
  from stats s  
) t
where t.rn = 1