Sql 如何计算运行平均值
情景: 我想计算到目前为止整个月的销售金额移动平均数。 每个月有不同的天数。如果销售额为0,则表示此人有休息日,我需要忽略该值 样本数据: 最终移动平均值为100+200+300+100/4,因为我们忽略了4月4日,因为它的销售额为0 我在此网站上发现的内容不符合我的需要: 但是它是针对特定的天数,当每个月有不同的天数并且我想忽略某些行时,我如何应用它 预期结果: 我试着做的是: 通过删除分区 由于您对0不感兴趣,请在销售金额上使用NULLIF 此外,在行之前还有一个额外的逗号Sql 如何计算运行平均值,sql,sql-server,tsql,Sql,Sql Server,Tsql,情景: 我想计算到目前为止整个月的销售金额移动平均数。 每个月有不同的天数。如果销售额为0,则表示此人有休息日,我需要忽略该值 样本数据: 最终移动平均值为100+200+300+100/4,因为我们忽略了4月4日,因为它的销售额为0 我在此网站上发现的内容不符合我的需要: 但是它是针对特定的天数,当每个月有不同的天数并且我想忽略某些行时,我如何应用它 预期结果: 我试着做的是: 通过删除分区 由于您对0不感兴趣,请在销售金额上使用NULLIF 此外,在行之前还有一个额外的逗号 您可以尝试使用两
您可以尝试使用两个聚合窗口函数来创建它,一个用于计算逻辑,另一个用于累计销售额
行之前有语法错误,不需要按日期进行分区。但实际上并不需要这些行。这应该满足您的要求:
AVG(NULLIF(Sales_Amount, 0)) OVER (Order by [Date])
如果您有重复的日期,那么您可能需要指定一个窗口框架,但您需要解释如何处理重复的日期。您可以使用相关查询,这样,对于小于外部查询的内部查询的所有日期,都会考虑进行平均计算
SELECT [sales_amount], [date],
(SELECT AVG(NULLIF(T2.sales_amount, 0))
FROM your_table T2
WHERE T2.orderdate <= T1.orderdate
) AS 'moving_average'
FROM your_table T1
ORDER BY T1.date
它将考虑所有日期小于或等于当前行[DATE ]的行,并计算它们的平均值。正如@Squirrel所提到的,NULLIFT2.sales_amount 0应该跳过平均计算中的0值。
您是否尝试过此网站的基本搜索?您期望的结果是什么?仅供参考,我在这个网站上发现的不符合我的需要:sqlservercentral不是这个网站:@D-Shih有帮助吗?如果您使用DDL+DML创建一个示例数据和一个完整的查询,人们可以更容易地提供帮助。AVG (Sales_Amount) OVER (
Partition BY [Date]
Order by [Date]
,Rows Between Unbounded Preceding and Current Row)
AVG ( NULLIF(Sales_Amount, 0) )
OVER
(
Order by [Date]
Rows Between Unbounded Preceding and Current Row
)
SELECT *,
SUM(sales_amount) OVER(Order by [Date])/
SUM(CASE WHEN sales_amount<>0 THEN 1 ELSE 0 END) OVER(Order by [Date]) moving_average
FROM T
AVG(NULLIF(Sales_Amount, 0)) OVER (Order by [Date])
SELECT [sales_amount], [date],
(SELECT AVG(NULLIF(T2.sales_amount, 0))
FROM your_table T2
WHERE T2.orderdate <= T1.orderdate
) AS 'moving_average'
FROM your_table T1
ORDER BY T1.date