如何计算hql中的加权平均值?

how to calculate weighted average in hql?

我是 HQL 的新手,我有一个 table 其中:

  1. A列对应商户名称,
  2. B 栏 >> 商家 ID
  3. C 列 >> 承诺发货(工作日)[named shipmentday]
  4. D 列 >> 商家在装运日基础上的 SKU 数量 [命名为 listing_count]
  5. E 列 >> 对应商家 [named total_listingcount]
  6. 的 SKU 总数

有没有像我在 Excel 上那样使用 HiveQL 计算每个商家的加权装运日平均值的简单查询? (由于出货日期可能会有所不同,因此并非每个商家的行数都相同)

您需要使用sum() over(order by time rows between preceding 4 and current row)的window功能。

SELECT
    merchantName,
    merchantID,
    shipmentday,
    listing_count,
    sum(shipmentday * listing_count) over(order by period rows between preceding 4 and current row) / sum(listing_count) over(order by period rows between preceding 4 and current row) as weighed_ma
FROM (
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS period
    FROM your_table
);

注意:如果数据中有时间列,则可以忽略子查询。我正在生成 period,因为您的样本中没有时间列。

如果 window 函数抛出错误,那么我假设您的 Hive 版本不支持所需的 windows 函数。或者,您可以使用 CROSS JOINCROSS JOIN 将源 table 中的所有行映射到目标 table 中的所有行(将其视为没有任何键匹配的左连接)。

WITH a AS (
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS period
    FROM your_table
)

SELECT
    merchantName,
    merchantID,
    shipmentday,
    listing_count,
    sum(shipmentday_b * listing_count_b) / sum(listing_count_b) AS weighted_ma
FROM (
    SELECT 
        a.*, 
        b.shipmentday AS shipmentday_b, 
        b.listing_count AS listing_count_b
    FROM a
    CROSS JOIN a AS b
    WHERE b.rn BETWEEN a.rn - 4 and a.rn
) a
GROUP BY merchantName, merchantID, shipmentday,listing_count;