【问题标题】:Finding the decade with highest car mileage寻找汽车里程最高的十年
【发布时间】:2018-01-05 10:41:14
【问题描述】:

所以我有两个使用 MySql 的表; OwnersCars,其中车主有生日,汽车有里程记录。表格看起来有点像这样:

Owners:
+-------+--------------+
| Field | Type         |
+-------+--------------+
| id    | varchar(10)  |
| birth | datetime     |
+-------+--------------+

Cars:
+--------------+-------------+
| Field        | Type        |
+--------------+-------------+
| licenceplate | varchar(6)  |
| mileage      | int(11)     |
| owner        | varchar(10) |
+--------------+-------------+

我想要一个 SQL 查询,它可以让我知道拥有最高里程汽车的司机是哪十年。我基本上想把某个十年出生的车主分组,计算出他们所拥有汽车的平均里程数,然后呈现平均里程最高的十年。我基本上想要这样的结果:

90后的车主最常开自己的车

我该怎么做?我用谷歌搜索和搜索,但甚至找不到如何选择十年。感谢任何帮助!

【问题讨论】:

  • 你试过了吗?
  • @Melody 是的,但我似乎并不接近。尝试 select max(mileage) as top_mileage, left(birth([year] as varchar(4)), 3) + '0s' ascade from Owners group by left(birth([year] as varchar(4)), 3 ) 按 top_mileage desc 排序
  • Jesper 请用您评论中的额外细节更新您的问题。

标签: mysql sql


【解决方案1】:

你想要这样的东西吗?

select FLOOR(YEAR(o.birth) / 10 ) * 10 n, max(c.mileage) as maxmileage 
from owners o inner join cars c ON o.id = c.owner
group by n
order by maxmileage desc

计算每十年最大mileage

【讨论】:

  • 嗯,我并没有真正得到所有 90 年代出生的车主的平均里程数,只是个人车主的平均数
  • 而在这种情况下,我需要专门要求 90 后出生的人提供结果,但我希望结果向我展示 90 后或 80 后或 70 后出生的车主是汽车开车最多的车主
  • 只是一个观察@Rainman,这不是只选择每十年中最高里程数的司机(而不是整体平均里程数)吗?所以你可以让一个 90 年代的年轻人跑 100 万英里,而那个年龄的其他人跑 1000 英里,但是 60 年代的中年人每个人都跑 50 万英里(总体上跑得更多一个队列)会在列表的后面吗?
  • @Steve,感谢您的反馈。你有一个很好的观点。计算平均值会给出更一致的结果。 OP应该考虑一下。
【解决方案2】:

由于我没有 MySQL 环境,请原谅以下任何语法错误。

您需要的逻辑有点不清楚,但我将您的问题解释为“对于每个出生十年,每位驾驶员的平均行驶里程是多少”。

编辑: 正如@cdaiga 所指出的,我应该包含一个LIMIT 子句以将结果限制为单行。我还考虑了@Rainman 的回答,并将额外的零放在SELECT 的十年中,这可能更利于展示和可读性。

编辑 2: 我已经调整了 group-by 子句以考虑到 cmets 中提到的错误。我不知道在 MySQL 中,您可以在 group-by 子句中引用 select 子句中命名的列。

SELECT
    ( (YEAR(birth) DIV 10) * 10 )   AS decade
    ,( SUM(mileage) / COUNT(id) )   AS avg_mileage_per_driver

FROM
    Owners

INNER JOIN
    Cars
    ON Owners.id = Cars.owner

GROUP BY
    decade  -- was:(YEAR(birth) DIV 10)

ORDER BY
    avg_mileage_per_driver DESC

LIMIT 1

【讨论】:

  • 他需要最大平均毫,所以加上LIMIT 1。
  • 不知不觉中,这是一个更好的解决方案,因为我实际上想要平均值。虽然,在使用此查询时,我收到一条关于该查询与 sql_mode=only_full_group_by?? 不兼容的错误消息?
  • 我并没有从中得到几十年,只是所有发生的岁月
  • @jesper,您是否使用DIV 函数进行除法,而不是斜线? Div 执行整数除法,所以我真的不明白你怎么会得到不同的年份。
  • @Jesper,它会工作 - 我的问题是 DIV 运算符是否工作,因为该运算符是专门为整数除法设计的(不需要额外调用 FLOOR),我不'看不出在 group by 被应用后如何正确应用它会给你留下不同的年份(因为一年除以十通常会留下一个小数,DIV 不应该返回小数,即它如何产生十年)。我只能假设您在翻译中犯了错误。
【解决方案3】:

我必须将我得到的两个答案结合起来才能得到平均值。我是这样理解的:

SELECT 
    FLOOR(YEAR(o.birth) / 10 ) * 10 AS decade, 
    (SUM(mileage) / COUNT(id)) AS avg_mileage_per_driver 
FROM 
    Owners o 
INNER JOIN 
    Cars c 
ON 
    o.id = c.owner 
GROUP BY 
    decade 
ORDER BY 
    decade 
DESC;

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2010-12-12
    • 2016-06-28
    相关资源
    最近更新 更多