如何计算hql中的加权平均值?
how to calculate weighted average in hql?
我是 HQL 的新手,我有一个 table 其中:
- A列对应商户名称,
- B 栏 >> 商家 ID
- C 列 >> 承诺发货(工作日)[named shipmentday]
- D 列 >> 商家在装运日基础上的 SKU 数量 [命名为 listing_count]
- E 列 >> 对应商家 [named total_listingcount]
的 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 JOIN
。 CROSS 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;
我是 HQL 的新手,我有一个 table 其中:
- A列对应商户名称,
- B 栏 >> 商家 ID
- C 列 >> 承诺发货(工作日)[named shipmentday]
- D 列 >> 商家在装运日基础上的 SKU 数量 [命名为 listing_count]
- E 列 >> 对应商家 [named total_listingcount] 的 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 JOIN
。 CROSS 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;