You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询拥有最高平均里程车辆的车主出生年代(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:17:38