如何解决计算月平均值,包括缺少数据的日期
我想使用SQL查询(其中数据位于redshift DB中)来计算某些数据的每月平均值。 表格中的数据以以下格式显示。
s_date | sales
------------+-------
2020-08-04 | 10
2020-08-05 | 20
---- | --
---- | --
一个月中的所有日期可能都没有数据。 如果一天中没有该数据,则应将其视为0。
以下是使用AVG()函数“按月份分组”的查询,它给出了基于可用日期数据的平均值。
select trunc(date_trunc('MONTH',s_date)::timestamp) as month,avg(sales) from sales group by month;
但是,它不会将缺少日期的数据视为0 。什么应该是正确的查询以按预期计算月平均值?
另一个期望是,对于当月,应该根据直到今天的数据来计算平均值。因此,不应考虑整个月(如30或31天)。
此致,
保罗
解决方法
使用日历表可能是最简单的方法:
WITH dates AS (
SELECT date_trunc('day',t)::date AS dt
FROM generate_series('2020-01-01'::timestamp,'2020-12-31'::timestamp,'1 day'::interval) t
),cte AS (
SELECT t.dt,COALESCE(SUM(s.sales),0) AS sales
FROM dates t
LEFT JOIN sales s ON t.dt = s.s_date
GROUP BY t.dt
)
SELECT
LEFT(dt::text,7) AS ym,AVG(sales) AS avg_sales
FROM cte
GROUP BY
LEFT(dt::text,7);
这里的逻辑是首先在第二个CTE中生成一个中间表,该中间表对数据集中的每个数据以及该日期的总销售额都有一条记录。然后,我们按年/月汇总,并报告平均销售额。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。