在Azure流分析中根据最近交易的500个交易量单位计算交易量加权平均价格

kr98yfug  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(96)

我有来自eventhub的流数据如下:

product  price  quantity 
 1        55      100
 2        44      200
 2        43      200
 1        60      300
 2        55      100
 2        44      50
 2        47      100
 1        44      100
 1        48      100

现在我想计算按产品分组的成交量加权平均价格,但总是只计算最近500个交易量单位的成交量(而不是所有值)。
基于时间窗口的计算是直接的,但我只想汇总过去500个单位的交易量。
所以我在寻找某种没有时间限制的窗口函数。这是现有的,甚至可能与流分析?

kb5ga3dv

kb5ga3dv1#

加权平均的公式为:

weighted_average = sum of (value * weight) / sum of weights

由于您有时间戳,您可以使用该字段来计算每个产品的基于数量列的加权平均价格,其中窗口框架包括过去500秒内的所有行。下面是查询

查询:

with Stgquery as(
select
product,  SUM(price)  OVER  (PARTITION  BY product LIMIT  DURATION  (second, 500))  as denom,
sum(cast(price as float)  *  cast(quantity as float))  over  (PARTITION  by product LIMIT  DURATION  (second, 500))  as num
from
input)
select product,weighted_average=(num/denom)  from Stgquery

在此查询中,CTE stgquery选择product、每组product值的price列的累积和,以及每组product值的pricequantity列的乘积之和(使用SUM函数,窗口框架包括最近500秒内的所有行)。这可以根据需要进行更改)。SELECT语句选择product列,并根据quantity列为每组product值计算price列的加权平均值。通过将pricequantity列的乘积之和(存储在Stgquery CTE的num列中)除以price列的累积和(存储在Stgquery CTE的denom列中)来计算加权平均值。结果作为名为weighted_average的新列返回。

输出:

| 加权平均| weighted_average |
| --| ------------ |
| 一百| 100 |
| 两百| 200 |
| 两百| 200 |
| 204.3478| 204.3478 |
| 161.2676| 161.2676 |
| 134.9462| 134.9462 |
| 一百二十七点八九七| 127.897 |
| 175.4717| 175.4717 |
| 157.971| 157.971 |

相关问题