【问题标题】:How to find the avg number of trips per day for each month in one year in MySQL如何在MySQL中找到一年中每个月每天的平均旅行次数
【发布时间】:2020-04-10 18:55:34
【问题描述】:

我在数据集中获得了 id、start_date、end_date,并要求在 MySQL 中查找每个月每天的平均旅行次数。

我的查询如下:

SELECT 
    YEAR(start_date) AS Year,
    MONTH(start_date) AS Month,
    COUNT(*) / (COUNT(DISTINCT YEAR(start_date))) AS avg_trips_per_day
FROM
    trips
GROUP BY Year , Month
ORDER BY Year , Month;

但 avg_trips_per_day 的返回结果是该月的总行程数。有什么建议吗?

【问题讨论】:

    标签: mysql average


    【解决方案1】:

    这会显示每个月和每年的平均旅行天数

    当这个月只有五天不同的开始日期时,它会计算每个旅行日的平均值

    SELECT     
        YEAR(start_date) AS 'Year',
        MONTH(start_date) AS 'Month',
         COUNT(*) /  COUNT(DISTINCT start_date) avg_trips_per_day
        FROM trips 
     GROUP BY YEAR(start_date),MONTH(start_date)
     ORDER BY YEAR(start_date),MONTH(start_date);
    

    dbfiddle

    【讨论】:

    • 因此,如果某人在 1 月 1 日(20 年 1 月 1 日)旅行了 3 次,并且在该月剩下的时间里没有其他旅行,您可以计算出他每天的平均旅行次数一月份是3/1 = 3。您可以计算出比一月份每天进行 3 次旅行的人要高,除了他只进行 2 次旅行的最后一天 (`92/31)。这听起来真的合理吗?我认为我们对一个月内每天平均出行次数的含义有不同的理解。
    • 问题开始了,我们不知道我们可以计算一个月中的哪几天,例如可以排除周末并且您的计算是错误的。我只计算实际旅行开始的日子,因为我没有其他事情要做,而且我没有做任何假设。如果用户告诉更多信息,我会等待。
    • 但我将按照我对英语的解释进行,这就是我能做的。我将更新我的答案以使我的观点更好。
    【解决方案2】:

    如果您想要一个月内每天的平均出行次数,您最终需要将一个月内的出行次数除以该月的天数。至少这是我对一个月内每天平均出行次数的理解(即计算中必须考虑一个月中的天数)。如果我在 2020 年 1 月 1 日进行了 3 次旅行,并且在这一年的剩余时间里没有其他旅行,那将是平均3每年。这也是 2020 年 1 月平均3每月。但它只能是3/31每天整个月.

    如果您只想除以实际出行的天数,那么问题的措辞应该是:“您如何计算每个出行天数的平均出行次数每个月……”或类似的话。

    另外,我不确定您想如何处理从一天开始到另一天结束的旅行。此 SQL 仅查看开始日期,因为那是您正在执行的操作:

    select year(start_date) as start_year,
           month(start_date) as start_month,
           count(*) /
           (select day(last_day(concat(start_year, '-', start_month, '-01')))) as avg
    from trips
    group by start_year, start_month
    order by start_year, start_month
    

    表达式select day(last_day(concat(start_year, '-', start_month, '-01'))) 计算由年份start_year 和月份start_month 给出的月份中的天数,这是必需的,因为一个月内每天的平均行程数是该月份的总行程数。月份除以该月的天数。

    See Db Fiddle

    【讨论】:

      【解决方案3】:

      您只需将YEAR 中的一个字改为DAYDATE

      SELECT 
          YEAR(start_date) AS Year,
          MONTH(start_date) AS Month,
          COUNT(*) / (COUNT(DISTINCT DAY(start_date))) AS avg_trips_per_day
      FROM
          trips
      GROUP BY Year , Month
      ORDER BY Year , Month;
      

      SELECT 
          YEAR(start_date) AS Year,
          MONTH(start_date) AS Month,
          COUNT(*) / (COUNT(DISTINCT DATE(start_date))) AS avg_trips_per_day
      FROM
          trips
      GROUP BY Year , Month
      ORDER BY Year , Month;
      

      您的结果是每月所有行程的总和的原因是因为 COUNT(DISTINCT YEAR(start_date)) 的结果是 1

      因此您可以运行以下两个查询来查看差异。

      SELECT 
          YEAR(start_date) AS Year,
          MONTH(start_date) AS Month,
          COUNT(*) AS total_trips_of_month,
          COUNT(DISTINCT DAY(start_date)) AS days_having_trips_that_month,
          COUNT(*) / (COUNT(DISTINCT YEAR(start_date))) AS avg_trips_per_day
      FROM
          trips
      GROUP BY Year , Month
      ORDER BY Year , Month
      

      对比

      SELECT 
          YEAR(start_date) AS Year,
          MONTH(start_date) AS Month,
          COUNT(*) AS total_trips_of_month,
          COUNT(DISTINCT DAY(start_date)) AS days_having_trips_that_month,
          COUNT(*) / (COUNT(DISTINCT DATE(start_date))) AS avg_trips_per_day
      FROM
          trips
      GROUP BY Year , Month
      ORDER BY Year , Month
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        • 2017-08-04
        • 2020-02-08
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多