如何计算行之间的动态平均值?
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计算)