如何在SQL查询中查找特定区域每个月的平均电话通话次数

时间:2019-11-20 07:33:44

标签: sql postgresql metabase

嗨,我需要显示sql查询的帮助

所以我想显示特定月份(例如2015年1月,2016年1月,2017年1月等)每个地区的总呼叫总数

下面是示例数据库

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 个答案:

答案 0 :(得分:0)

您可以使用email函数来date_partextract月份名称和年份。

group by

答案 1 :(得分:0)

使用直接日期比较:

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也已修改。