查询拥有最高平均里程车辆的车主出生年代(MySQL)
解决按车主出生年代计算平均里程并找出最高年代的问题
没问题,我来一步步帮你搞定这个需求。核心难点是从birth字段提取出生年代,再关联车辆数据计算平均里程,最后输出你想要的结果文本。
第一步:提取出生年代
MySQL里可以通过YEAR()函数从datetime类型的birth字段中提取年份,再用RIGHT()函数取年份的后两位,最后拼接“年代”二字,就能得到类似“90年代”的格式:
CONCAT(RIGHT(YEAR(birth), 2), '年代') AS birth_decade
比如1995-03-12的birth值,经过这个处理后就会变成90年代。
第二步:关联表并计算各年代平均里程
我们需要把Owners和Cars表通过车主ID关联(Owners.id = Cars.owner),然后按提取出的年代分组,计算每组的平均里程:
SELECT CONCAT(RIGHT(YEAR(o.birth), 2), '年代') AS birth_decade, AVG(c.mileage) AS average_mileage FROM Owners o JOIN Cars c ON o.id = c.owner GROUP BY birth_decade ORDER BY average_mileage DESC;
这个查询会返回每个年代对应的平均里程,并且按平均里程从高到低排序。
第三步:获取平均里程最高的年代并输出目标文本
如果只需要一个最高结果(即使有并列也只取第一个),可以用子查询加LIMIT 1,再拼接成你想要的语句:
SELECT CONCAT( birth_decade, '出生的车主用车频率最高' ) AS result FROM ( SELECT CONCAT(RIGHT(YEAR(o.birth), 2), '年代') AS birth_decade, AVG(c.mileage) AS average_mileage FROM Owners o JOIN Cars c ON o.id = c.owner GROUP BY birth_decade ORDER BY average_mileage DESC LIMIT 1 ) AS decade_avg;
如果存在多个年代平均里程并列最高的情况,上面的语句只会返回第一个。这时候可以用窗口函数RANK()处理,确保所有并列第一的年代都能被输出:
SELECT CONCAT(birth_decade, '出生的车主用车频率最高') AS result FROM ( SELECT CONCAT(RIGHT(YEAR(o.birth), 2), '年代') AS birth_decade, AVG(c.mileage) AS average_mileage, RANK() OVER (ORDER BY AVG(c.mileage) DESC) AS rnk FROM Owners o JOIN Cars c ON o.id = c.owner GROUP BY birth_decade ) AS ranked_decades WHERE rnk = 1;
小提示
- 如果数据里有
NULL值(比如车主没有车辆,或者里程为空),可以用AVG(IFNULL(c.mileage, 0))处理,避免平均里程计算出错。 - 如果需要包含没有车辆的车主(虽然他们的平均里程会是0或NULL),可以把
JOIN改成LEFT JOIN。
内容的提问来源于stack exchange,提问作者Jesper
相关产品推荐
相关产品推荐

