如何按季度计算日均

h5qlskok  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(988)

我有一个 Order 表中的列,包括 order_nbr , create_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轴。
我所能想到的就是 avgavg 在长达90天的运行窗口上。另一个想法是创造一个 Date 维度表。所以每个日期都有一个对应的季度名称。不过,我不清楚如何为此编写sql查询。

xytpbqjk

xytpbqjk1#

要绘制日均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)来确定具体的季度。

vohkndzv

vohkndzv2#

您只需向查询中添加一个部分,即可按日期范围筛选结果。应用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)
)

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

2eafrhcq

2eafrhcq3#

你可以用 YEAR() 以及 QUARTER() 功能和分组?

SELECT
  YEAR(   DATE(create_ts))   AS YearID,
  QUARTER(DATE(create_ts))   AS QuarterID,
  COUNT(DISTINCT order_nbr)
FROM
  order
GROUP BY
  YEAR(   DATE(create_ts)),
  QUARTER(DATE(create_ts))

相关问题