如何计算行之间的动态平均值?

Posted

技术标签:

【中文标题】如何计算行之间的动态平均值?【英文标题】:How to calculate a dynamic average value between rows? 【发布时间】:2017-01-12 14:35:19 【问题描述】:

如何计算行间的动态平均值?

前 12 个月 status_flag 将是 N 并且从第 13 个月开始,我们需要获取前 13 行的平均销售额,并将其与最小值和最大值进行比较,如果它位于最小值和最大值之间,则设置将status_flag 设置为Y 否则将其设置为N

第 14 行相同,取前 14 行的平均值,然后将其与 min 和 max 进行比较......等等。

如何做到这一点?

【问题讨论】:

您使用的是 Oracle 还是 MS SQL Server? (不要标记未涉及的产品。) 我使用的是 Oracle,但这个问题很笼统。不特定于 Oracle。 @jarlh 您的问题有点混乱...请​​尝试改写它。 如果您不知道是否需要向表中添加列,那么担心代码可能是您最不关心的问题。 【参考方案1】:

我认为具有挑战性的部分是获得平均销售额。您可以使用Analytic Functions:

select Storeid, Months, Min, Max, sales,
   avg(sales) over (order by Months RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as avg_sales
from your_table;

其余的应该更容易。注意,RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 是默认的,所以你可以跳过它。

with a as 
   (select Storeid, Months, Min, Max, sales,
       avg(sales) over (order by Months) as avg_sales
    from your_table)
select  Storeid, Months, Min, Max, sales, avg_sales,
   case 
      when Months <= 12 then 'N'
   else
      case 
         when avg_sales between Min and Max then 'Y'
         else 'N'
      end 
   end as Status_flag
from a;

【讨论】:

【参考方案2】:
Update table t set status_flag =
   case when 
     (Select count(*)
      From table 
      where month <= t.Month) > 12
    and
     (select avg(sales)
      from table 
      where Month <= t.Month)
     Between Min and Max 
   then 'Y' else 'N' end

【讨论】:

以上是关于如何计算行之间的动态平均值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何计算订单购买之间的平均时间? (根据下一行和上一行进行sql计算)

如何使用Scala计算Spark中数据框中列的开始索引和结束索引之间的行的平均值?

如何有效地计算动态平均值(移动平均值)?

从 SQLite 中的所有行中减去平均值

如何计算数组中对象值的动态平均值?

JavaFX:如何从 GridPane 中动态创建的文本字段的值计算平均值?