我有一张 table ,里面有汽车。每辆车都有一个唯一的id
,以及其他与汽车统计信息相关的列。我想展示最快的 10 辆汽车。如果一辆车有相同的 Trim + ModelID + MakeID,我只想显示最新的车。
示例:
Year Make Model Trim Time060
--------------------------------
2017 Bugatti Chiron null 2.3
2018 Bugatti Chiron null 2.3
我的问题是,如果 Trim 为 null,则 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
我尝试使用...(SELECT MakeID, ModelID, IFNULL(Trim, 'temp_trim') AS Trim, MAX(Year) AS Year FROM stats GROUP BY Trim, ModelID, MakeID)...
,但这也不起作用。
最佳答案
使用NOT EXISTS
和空安全等于运算符 <=>
检查 NULL
是否相等s:
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
)
请参阅demo .
或者:
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
)
请参阅demo .
或者使用连接:
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
请参阅demo .
由于您对性能感兴趣,因此如果您的 MySql/MariaDB 版本支持窗口函数,请检查另一个选项:
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
请参阅demo .
关于mysql - 分组最大 mysql 查询忽略 NULL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59593451/