Groupwise max mysql查询忽略空列
我有一张有汽车的桌子。每辆车都有一个唯一的id和其他与汽车统计相关的列。我想展示十大最快的汽车。如果一辆车有相同的内饰+ModelID+MakeID,我只想显示最新的车 例如: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年都不会出现。如
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