Как найти среднее количество телефонных звонков по району за определенный месяц в SQL-запросе

Привет, мне нужна помощь в отображении запроса sql

Поэтому я хотел отобразить среднее общее количество звонков, сделанных по району в конкретный месяц, например, январь 2015, январь 2016, январь 2017 и т. Д.

Ниже приведен образец базы данных

id            created_on            district_name
11       January 1, 2014, 12:00 AM    azamgarh
24       January 1, 2014, 12:00 AM    badaun
7        January 1, 2014, 12:00 AM     badgam
1        January 1, 2014, 12:00 AM     bagalkot
6        January 1, 2014, 12:00 AM     baghpat
18       January 1, 2014, 12:00 AM    bahraich
4        January 1, 2014, 12:00 AM     balaghat

id - звонки, created_on - дата, District_name - местоположение района

Это мой код по этой проблеме

 select
    t.district_name as "District",
    t.created_on::date as "Date",
    COUNT(t.id) AS "Total calls",
    AVG(COUNT(t.id)) OVER() as "Average"
from t
where
    date_part('month',  t.created_on::date) = 1 
    and date_part('year',  t.created_on::date) between 2013 and 2018
group by  
    date_part('year',  t.created_on::date)
    , date_part('month',  t.created_on::date)
    , district_name, created_on

этот код показывает только общее среднее количество звонков, которые у меня были с 2010 по 2018 год в январе, а не за конкретный год 2013 -2018.

Может ли кто-нибудь помочь мне с этой проблемой? заранее спасибо

2 ответа

Решение

Ты можешь использовать date_part функция для extract а также group by название месяца и год.

select
    t.district_name as "District",
    t.created_on::date as "Date",
    SUM(t.id) / COUNT(t.id) as average
from t
where
    date_part('month',  t.created_on::date) = 1 
    and date_part('year',  t.created_on::date) <= 2018    
group by  
    date_part('year',  t.created_on::date)
    , date_part('month',  t.created_on::date)
    , district_name

Используйте прямое сравнение дат:

SELECT t.district_name as "District",
       t.created_on::date as "Date",
       SUM(t.id) / COUNT(t.id) as average
FROM t
WHERE created_on >= '2018-01-01' AND
      created_on < '2018-02-01'
GROUP BY created_on::date, district_name;

По возможности вы не хотите использовать функции для столбцов в whereпункт. Вот три причины:

  • Это предотвращает использование индексов, использующих столбец.
  • Это предотвращает использование разделов, использующих столбец.
  • Это мешает оптимизатору, поскольку ограничивает использование табличной статистики.

Кроме того, вы хотите агрегировать по дате без компонента времени, поэтомуGROUP BY также был изменен.

Другие вопросы по тегам