【问题标题】:How to get lagging 6 month average by ID column如何通过 ID 列获得滞后 6 个月的平均值
【发布时间】:2019-07-19 08:37:53
【问题描述】:

我正在尝试向名为 #opp_level 的现有临时表添加一个新列。此新列应按帐号反映当前关闭日期前 6 个月的平均支出。

我尝试了以下两种方法,但没有成功。

方法一:

SELECT 
[Close Date],
[Prior 6 Mo Date],
[Opportunity Id],
[Account Name],
[Account Number],
[Total Opportunity Amount],
AVG([Total Opportunity Amount]) OVER (
PARTITION BY [Account Number]
ORDER BY [Close Date]
RANGE BETWEEN [Prior 6 Mo Date] and [Close Date] --also tried BETWEEN 
unbounded preceding and current row
)
FROM #opp_level
ORDER BY 
[Close Date],
[Prior 6 Mo Date],
[Opportunity Id],
[Account Name],
[Account Number],
[Total Opportunity Amount]

方法二:

select a.[Close Date],a.[Total Opportunity Amount], avg(b.[Total 
Opportunity Amount]) AS [Prior 6 Mo Avg]
from #opp_level a
join #opp_level b
  on b.[Close Date]
     between dateadd(MONTH, -6, a.[Close Date]) and a.[Close Date]
group by a.[Close Date], a.[Total Opportunity Amount]
ORDER BY a.[Close Date]

我当前的数据集在没有“前 6 个月平均”列的情况下如下所示。这就是我要添加的列。

 Close Date  Prior 6 Mo Date  Opportunity Id  Account Name  Account Number  Total Opportunity Amount  Prior 6 Month Avg Opp Spend
1/1/2018      7/1/2017            12345        A Team         8763496                50                         50
6/1/2018      12/1/2017           12345        A Team         8763496                1000                     525
11/1/2018     5/1/2018            12345        A Team         8763496                500                      750
1/1/2018      7/1/2017            67890        B Team         9812081                300                      300
6/1/2018      12/1/2017           67890        B Team         9812081                2000                     1150
11/1/2018     5/1/2018            67890        B Team         9812081                80                         1040

【问题讨论】:

  • 你试过 AVG(CASE WHEN) 吗?
  • 以表格格式展示您的样本和预期输出数据,以便更好地理解。
  • 不幸的是,AVG(CASE WHEN) 不起作用@Jervs
  • 我已经更新了表格视图,很抱歉@mkRabbani
  • 什么是 Order 键以确保哪些行应该在哪一行之前或之后。您的日期列当前排序误导理解事物。

标签: sql sql-server


【解决方案1】:

我想你快到了。从您的第一个查询中,只需替换以下内容:

AVG([Total Opportunity Amount]) OVER (
PARTITION BY [Account Number]
ORDER BY [Close Date]
RANGE BETWEEN [Prior 6 Mo Date] and [Close Date] --also tried BETWEEN 
unbounded preceding and current row

到这里:

AVG([Total Opportunity Amount]) OVER (
PARTITION BY [Account Number]
ORDER BY [Close Date]
ROWS BETWEEN 1 preceding and current row)

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2018-09-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多