Как найти среднее число поездок в день за каждый месяц за один год в MySQL - PullRequest
0 голосов
/ 10 апреля 2020

Мне дали 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 было общее количество поездок в этом месяце. Есть предложения?

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Здесь отображается среднее число поездок за пройденные дни для каждого месяца и года.

Spo, если в этом месяце только пять дней с различной начальной датой, рассчитывается среднее значение для каждого пройденного дня

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

0 голосов
/ 12 апреля 2020

Вам нужно изменить только одно слово с YEAR на DAY или DATE.

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
0 голосов
/ 10 апреля 2020

Если вам нужно среднее количество поездок в день в течение месяца, вам необходимо в конечном итоге разделить количество поездок за месяц на количество дней в этом месяце. По крайней мере, я так понимаю, что означает среднее число поездок в день за месяц (т. Е. Количество дней в месяце должно учитываться при расчете). Если бы я совершил 3 поездки 1 января 2020 года и не проводил никаких других поездок до конца года, это было бы в среднем 3 поездок в год . Это также будет в среднем 3 поездок в месяц за январь 2020 года. Но это может быть только 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, что необходимо, поскольку среднее число поездок в день в течение месяца - это общее количество поездок за месяц, деленное на количество дней в месяце.

См. Db Fiddle

...