【问题标题】:Querying average and rolling 12 month average查询平均值和滚动 12 个月平均值
【发布时间】:2016-06-16 13:13:27
【问题描述】:

我希望能够找出每个客户的更改次数统计数据的每月平均值和过去 12 个月的滚动平均值。

SELECT 
    crq_requested_by_company as 'Customer',
    COUNT(crq_number) as 'Number of Changes'
FROM 
    change_information ci1
GROUP BY 
    crq_requested_by_company

目前我只是在计算总数,我的结果看起来像这样

crq_requested_by_company    count   
A                             4
B                             2
C                             2269
D                             7696
E                             110
F                             91
G                             33

我将使用的日期列称为“start_date”。

我认为需要GETDATE() 来计算过去 12 个月的滚动平均值。

cmets 之后的其他信息:

使用代码

;WITH CTE as
(
SELECT 
crq_requested_by_company as Customer,
COUNT(crq_number) Nuc,
dateadd(month, datediff(month, 0, crq_start_date),0) m
FROM 
change_information ci1
WHERE
crq_start_date >= dateadd(month,datediff(month, 0,getdate()) - 12,0)
GROUP BY 
crq_requested_by_company,
datediff(month, 0, crq_start_date)
)
SELECT 
Customer,
avg(Nuc) over (partition by Customer order by m) running_avg,
m start_month,
avg(Nuc) over (partition by Customer) simply_average
FROM
CTE
ORDER BY Customer, start_month

这给出了结果

Customer    running_avg start_month      simply_average
A                8      01/01/2016 00:00 13
A                10     01/02/2016 00:00 13
A                10     01/03/2016 00:00 13
A                11     01/04/2016 00:00 13
A                14     01/05/2016 00:00 13
A                13     01/06/2016 00:00 13
B                1      01/01/2016 00:00 1
C                3      01/01/2016 00:00 2
C                3      01/02/2016 00:00 2
C                2      01/03/2016 00:00 2
C                2      01/04/2016 00:00 2
C                2      01/05/2016 00:00 2
C                2      01/06/2016 00:00 2

它需要看起来像这样,所以上面的结果的平均值 - 上面 6 个月的平均值(我目前只有 6 个月的数据,最终需要是 12 个月)

Customer   avg_of_running_avg
A          11
B          1
C          2

【问题讨论】:

  • 简单平均或日加权平均。
  • @JohnCappelletti 1) 只是每月的简单平均计数 2) 过去 12 个月每月计数的滚动平均值
  • 所以你只需要 running_avg 结果的平均值?这应该通过我刚才所做的更改来解决

标签: sql sql-server average window-functions getdate


【解决方案1】:

试试这个,它应该适用于使用运行平均值的 sqlserver 2012:

;WITH CTE as
(
SELECT 
    crq_requested_by_company as Customer,
    COUNT(crq_number) Nuc,
    dateadd(month, datediff(month, 0, start_date),0) m
FROM 
    change_information ci1
WHERE
  start_date >= dateadd(month,datediff(month, 0,getdate()) - 12,0)
GROUP BY 
    crq_requested_by_company,
    datediff(month, 0, start_date)
)
SELECT 
  Customer,
  avg(Nuc) over (partition by Customer order by m) running_avg,
  m start_month,
  avg(Nuc) over (partition by Customer) simply_average
FROM
  CTE
ORDER BY Customer, start_month

【讨论】:

  • 这给出了每个月的平均计数。我现在需要过去 12 个月的平均值。结果如下所示 Customer running_avg start_month A 8 01/01/2016 00:00 A 10 01/02/2016 00:00 A 10 01/03/2016 00:00 A 11 01/04/2016 00:00 A 14 01/05/2016 00:00 A 13 01/06/2016 00:00 B 1 01/01/2016 00:00 C 3 01/01/2016 00:00 C 3 01/02/2016 00:00 C 2 01/03/2016 00:00 C 2 01/04/2016 00:00 C 2 01/05/2016 00:00 C 2 01/06/2016 00:00 我需要它看起来像这样 客户 avg_of_running_avg A 11 B 1 C 2
  • @DeanFlaherty 也许你应该提出问题的一部分
  • 我现在已经在上面添加了
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多