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

Posted

技术标签:

【中文标题】如何计算hql中的加权平均值?【英文标题】:how to calculate weighted average in hql? 【发布时间】:2021-05-02 12:50:26 【问题描述】:

我是 HQL 的新手,我有一张桌子:

    A栏对应商家名称, B栏>>商户ID C 栏 >> 承诺发货(以工作日为单位)[指定发货日] column D >> nr 商家在发货日基础上拥有的 SKU [named Listing_count] E栏>>对应于该商家[named total_listingcount]的SKU总数

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

【问题讨论】:

【参考方案1】:

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

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,因为您的示例中没有时间列。

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

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;

【讨论】:

谢谢,但它抛出错误:编译语句时出错:失败:ParseException 行 6:71 无法识别 windowframeboundary 中的“preceding”“4”“和”附近的输入,顺便说一句,shipmentday 信息是静态的SKU,不生成周期就不能计算吗? 选择商家名称,sum(shipmentday * Listing_count) / sum(listing_count) over (partition by Merchantname) as weighted_ma from my_table 计算正确,但商家名称重复,有什么方法可以避免重复记录吗?我不能在查询中使用 group by 如果订购了shipmentday,则可以根据shipmentday订购 为了避免重复使用SELECT DISTINCT * FROM ( <your query> ) a

以上是关于如何计算hql中的加权平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在r中的循环中引导加权平均值

numpy/python 中的加权平均值

使用 NumPy 函数计算 Pandas 中的加权平均值

group的加权平均值不等于pandas groupby中的总平均值

如何计算三只股票的加权平均值

Pandas:交换一个数据框中的特定列值并计算其加权平均值