如何按季度计算每日平均值

时间:2018-09-19 02:59:09

标签: mysql sql

我的数据库中有一个Order表,其中的列包括order_nbrcreate_ts等。

直接使用以下SQL计算每日平均订单数

select avg(cnt)
from 
(  
  select date(create_ts) dt, count(distinct order_nbr)
  from order
  group by date(create_ts)
)

如果我想绘制每日平均数与季度数怎么办?如何估算一定时间内的平均值?出于演示目的,它将是一个条形图,其中日平均值为y​​轴,季度(2017Q3、2017Q4、2018Q1、2018Q2)为x轴。

我能想到的是,这将是长达90天的运行窗口中avg的{​​{1}}。另一个想法可能是创建一个avg维度表。因此,每个日期都有一个相应的季度名称。我不清楚如何为此编写SQL查询。

3 个答案:

答案 0 :(得分:1)

要绘制每日平均v / s季度的图,您基本上需要计算一个季度的每日平均值,然后根据该季度将它们分组。

要获取与日期对应的季度,可以使用Quarter()函数。

尝试以下查询:

SELECT 
  YEAR(inner_nest.dt) AS yr, 
  QUARTER(inner_nest.dt) AS qtr, 
  AVG(inner_nest.daily_avg) AS daily_avg_qtrwise 
FROM 
(
 SELECT 
   DATE(create_ts) AS dt, 
   COUNT(DISTINCT order_nbr) AS daily_avg 
 FROM order 
 GROUP BY DATE(create_ts) 
) 
GROUP BY 
  YEAR(inner_nest.dt), 
  QUARTER(inner_nest.dt)

注意Quarter()函数仅返回特定年份的季度数字。因此,您将需要使用年份数字(yr)和季度数字(qtr),以确定特定的季度。

答案 1 :(得分:0)

您只需要向查询添加一个部分即可按日期范围过滤结果。 应用WHERE语句选择要过滤的字段和结果,然后使用AND语句应用其他过滤器。

例如:

select avg(cnt)
from
(
  select date(create_ts) dt, count(distinct order_nbr)
  from order
  where date(create_ts) >= date(START_DATE) and date(create_ts) <= date(END_DATE)
  group by date(create_ts)
)

这意味着您每个季度都需要一个单独的查询。

答案 2 :(得分:0)

您可以只使用constexprYEAR()函数并按它们分组吗?

QUARTER()